如何将两个Eloquent Builder变量链接在一起



假设我有一个变量$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();

最新更新