多对多和在哪里

时间:2019-05-12 18:08:39

标签: laravel eloquent

我在AdInterest和AdInterestGroup模型之间具有ManyToMany关系,在每个模型中都有一个EmiratesToMany()方法,因此我可以使用动态属性:

AdInterest->groups  
AdInterestGroup->interests

我可以在一个小组中找到所有“兴趣”,像这样:

$interests = AdInterestGroup::find(1)->interests->pluck('foo');

我需要的是多个组中相关的'foo'字段的合并,重复数据删除数组。
我想我可以使用->unique()进行重复数据删除,但是首先,正如您所期望的那样:

AdInterestGroup::whereIn('id',[1,2])->interests->get();

抛出:

  

Eloquent构建器实例上不存在属性[兴趣]。

建议似乎是通过 with()使用急切加载

AdInterestGroup::with('interests')->whereIn('id',[1,2])->get();

首先,正如您所期望的那样,这虽然给了我两个值的数组(每个ID一个)。

此外,如果我再次尝试pluck('foo'),它正在查找错误的数据库表:来自 AdInterestGroup 表,而不是关系( AdInterest

是否有一个很好的,整洁的Collection方法/管道,可以用来合并数据并访问关系字段?

1 个答案:

答案 0 :(得分:1)

使用pluck()flatten()

$groups = AdInterestGroup::with('interests')->whereIn('id', [1, 2])->get();

$interests = $groups->pluck('interests')->flatten();

$foos = $interests->pluck('foo')->unique();