BelongsToMany 关系。如何获得唯一的行

Igo*_*iuk 6 unique has-and-belongs-to-many laravel eloquent

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

在此处输入图片说明

并且在模型 Member 中有一个关系:

public function companies()
{
    return $this->belongsToMany(Company::class, 'member_companies');
}
Run Code Online (Sandbox Code Playgroud)

它返回给我所有有重复的公司。例如,Member::find(238)->companies->pluck('id')返回

[
  6,
  5,
  7,
  2,
  10,
  8,
  4,
  13,
  14,
  10,
  8,
  13
]
Run Code Online (Sandbox Code Playgroud)

但我只想要独特的物品。喜欢

[
    6,
    5,
    7,
    2,
    10,
    8,
    4,
    13,
    14,
]   
Run Code Online (Sandbox Code Playgroud)

我怎样才能用雄辩的关系做到这一点?

小智 9

不确定它是否是新添加的,但您可以这样做(至少在 Laravel 7 中):

public function companies()
{
    return $this->belongsToMany(Company::class, 'member_companies')->distinct();
}
Run Code Online (Sandbox Code Playgroud)

  • 仅当您不包含数据透视表中的任何列时,这才有效,即您不能使用 `->withPivot()` 或 `->withTimestamps()`。 (3认同)

Igo*_*iuk 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;
}
Run Code Online (Sandbox Code Playgroud)

但也许这段代码还有更微妙的变体?