Laravel 从关系和子关系中获取条目
我有三个表Laravel 从关系和子关系中获取条目,laravel,eloquent,Laravel,Eloquent,我有三个表foo,bar和lorem。它们通过多对多关系相互连接 如何有效地获取lorem的所有条目,其中foo.id是123,包括直接获取和通过bar(无重复项) ==编辑=== 模式: Foo -> Lorem | |----- MERGE Foo -> Bar -> Lorem | 我现在是这样做的: # Get lorems from foos $loremsA = Foo::find(123)->
foo
,bar
和lorem
。它们通过多对多关系相互连接
如何有效地获取lorem
的所有条目,其中foo.id
是123
,包括直接获取和通过bar
(无重复项)
==编辑===
模式:
Foo -> Lorem |
|----- MERGE
Foo -> Bar -> Lorem |
我现在是这样做的:
# Get lorems from foos
$loremsA = Foo::find(123)->lorems()->get();
# Get ids of bars for given foo:
$bar_ids = Foo::find(123)->bars()->pluck('id')->toArray();
# Get lorems from bars
$loremsB = Lorem::whereHas('bars', fn($q) => $q->whereIn('id', $bar_ids))->get();
# Merge
$loremsB->merge($loremsA)
有更好的方法吗?反向查询应该适合您。直接查询
Lorem
模型,检查是否存在反向关系:
Lorem::whereHas('bar',函数($query){
$query->whereHas('foos',函数($subQuery){
$subQuery->where('foos.id',123);
})
})->get();
如果Lorem
可以直接与Foo
相关,那么您可以执行或wherehas()
:
Lorem::whereHas('bar',函数($query){
$query->whereHas('foos',函数($subQuery){
$subQuery->where('foos.id',123);
})
})->或者wherehas('foos',函数($query){
$query->where('foos.id',123);
})->get();
这将返回所有属于
Foo
的Lorem
模型,或者直接属于Foo
的Bar
模型,或者至少对我来说,你的问题有点简短和模糊。你能再解释一下吗?@AhmadKarimi我刚刚更新了我的帖子,让它不那么模棱两可谢谢你的回答!无论我怎么做,两个查询都出现了语法错误,意外的“}”,期望的“')
;A代码>也丢失;-)非常感谢,给人留下深刻印象。对不起,我今天好像没打字了;我经常在不同的语言之间交换,大多数语言都不需要代码>。很乐意为您效劳,干杯!只要它们通过ID链接并正确索引,两个查询都应该非常快速。Laravel关系有时不是最理想的查询,而且有一些库可以调整连接在幕后的执行方式,但是您必须进行一些研究和分析,以确定是否有必要使用它们。