Laravel 子查询

Laravel Subquery

如何在 Laravel 中执行此查询?我想我陷入了一个正确的纠结。

select * from `entries`
where (`id` = (
    select entry_id FROM `elements` where `content` = 'David'
));

我有一个 Entry 模型和一个 Element 模型,预加载工作正常(即,如果我改为 $entries = Entry::with('elements');,效果很好)。

我想抓取元素相关元素具有特定值的条目。

我的尝试获取所有条目,但仅获取适合查询的元素:

$entries = Entry::with(['elements' => function($q) use ($find){
    $q->where('content', '=', $find);
}])->get();

要按相关模型进行过滤,您可以使用 has()。在这种情况下,因为您有条件申请,whereHas:

$entries = Entry::with(['elements' => function($q) use ($find){
    $q->where('content', '=', $find);
}])
->whereHas('elements', function($q) use ($find){
    $q->where('content', '=', $find);
})->get();

这现在只会预先加载与谓词匹配的相关模型,并确保仅返回至少具有一个相关模型的条目。

为了减少重复代码,您还可以将闭包放在一个变量中:

$filter = function($q) use ($find){
    $q->where('content', '=', $find);
};

$entries = Entry::with(['elements' => $filter])->whereHas('elements', $filter)->get();