假设我有一个变量$myQuery
,它是一个IlluminateDatabaseEloquentBuilder
,通过链接本地和/或动态作用域构建。它可能被设置为类似于Comment::lengthBetween(1000, 50000)->popular()
的内容,如果执行它,就会发现长的、流行的注释。
如何获取评论与$myQuery
匹配的帖子?这看起来像是whereHas
:的工作
$posts = Post::whereHas('comments', function (Builder $query) use ($myQuery) {
// Insert code here
})->get();
插入$query->lengthBetween(1000, 50000)->popular();
可以得到特定作用域组合的正确结果,但$myQuery
是一个变量,它不会总是使用这些作用域。
union
函数在这里不起作用有几个原因(希望是显而易见的(。设置$query = $myQuery
也不需要(因为whereHas
转换为SQLwhere exists
,并且它需要链接外键和主键,这在$query
中完成(。
那么,我如何将$query
和$myQuery
链接起来呢?
注:
- 这段代码只是一个例子,基于Laravel文档;我的真实代码是相似的,但不是关于帖子和评论
- 我不想用
DB::raw()
,因为它很丑
您可以调用其他模型的作用域。
试试这样的东西。
$posts = Post::whereHas('comments', function ($query) use ($myQuery) {
$query->lengthBetween(1000, 50000)->popular();
})->get();
使用合并绑定
$posts = Post::->join(
DB::raw('(' . $myQuery->toSql() . ') comments'),
'comments.post_id'
'=',
'post.id'
)->mergeBindings($myQuery->getQuery())->get();