Относится к многим отношениям.Как получить уникальные строки - PullRequest
4 голосов
/ 11 апреля 2019

У меня есть следующая 'member_companies' таблица в БД:

enter image description here

И в модели Member есть отношение:

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

И мне возвращаются все компании с дубликатами.Например, Member::find(238)->companies->pluck('id') return

[
  6,
  5,
  7,
  2,
  10,
  8,
  4,
  13,
  14,
  10,
  8,
  13
]

Но я хочу только уникальные предметы.Как

[
    6,
    5,
    7,
    2,
    10,
    8,
    4,
    13,
    14,
]   

Как я могу сделать это с красноречивыми отношениями?

Ответы [ 3 ]

1 голос
/ 18 апреля 2019

Я нашел следующее решение:

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;
}

Но, может быть, есть более тонкий вариант этого кода?

0 голосов
/ 11 апреля 2019

Вы можете использовать группу следующим образом

Member::with(['companies' => function($query){
    $query->groupBy(id'');
}])->get();
0 голосов
/ 11 апреля 2019

Вы должны использовать метод unique () в вашем контроллере:

Member::find(238)->companies->pluck('id')->unique('id');

Документы:

Уникальный метод возвращает все уникальные элементы в коллекции. В возвращенной коллекции хранятся исходные ключи массива

При работе с вложенными массивами или объектами вы можете указать ключ, используемый для определения уникальности

Или в вашем отношении вы можете использовать groupBy () :

public function companies()
{
    return $this->belongsToMany(Company::class, 'member_companies')->groupBy('id');
}
...