属于多个关系。如何获得唯一的行

时间:2019-04-11 13:18:19

标签: laravel eloquent unique has-and-belongs-to-many

我在数据库中有下一个'member_companies'表:

enter image description here

在模型成员中有一个关系:

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,
]   

我该如何处理雄辩的关系?

4 个答案:

答案 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();