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关系有时不是最理想的查询,而且有一些库可以调整连接在幕后的执行方式,但是您必须进行一些研究和分析,以确定是否有必要使用它们。