我在数据库中有下一个'member_companies'
表:
在模型成员中有一个关系:
public function companies()
{
return $this->belongsToMany(Company::class, 'member_companies');
}
这使我回到所有拥有复制品的公司。例如,Member::find(238)->companies->pluck('id')
返回
[
6,
5,
7,
2,
10,
8,
4,
13,
14,
10,
8,
13
]
但是我只想要独特的物品。像
[
6,
5,
7,
2,
10,
8,
4,
13,
14,
]
我该如何处理雄辩的关系?
答案 0 :(得分:4)
不确定是否新增了它,但是您可以执行此操作(至少在Laravel 7中如此):
public function companies()
{
return $this->belongsToMany(Company::class, 'member_companies')->distinct();
}
答案 1 :(得分:1)
我找到了下一个解决方案:
public function companies()
{
$relation = $this->belongsToMany(Company::class, 'member_companies');
$relation->getQuery()->getQuery()
->joins[0]->table = \DB::raw('(SELECT DISTINCT member_id, company_id FROM member_companies) as member_companies');
return $relation;
}
但是此代码可能还有更精致的变体?
答案 2 :(得分:0)
您应该在控制器中使用unique()方法:
Member::find(238)->companies->pluck('id')->unique('id');
文档:
唯一方法返回集合中的所有唯一项。返回的集合保留原始数组键
在处理嵌套数组或对象时,您可以指定用于确定唯一性的键
或者在您的关系中,您可以使用groupBy():
public function companies()
{
return $this->belongsToMany(Company::class, 'member_companies')->groupBy('id');
}
答案 3 :(得分:0)
您可以像这样使用分组方式
Member::with(['companies' => function($query){
$query->groupBy(id'');
}])->get();