PankovAlxndr
@PankovAlxndr
Fullstack web developer

Как составить релейшен Laravel?

Здравствуйте, у меня такая структура таблиц
6533f439c7708597748748.png
Есть юзер, магазин, пункт выдачи заказа (пвз)
У юезра может быть много магазинов
У магазинов много пвз

в моделях у меня такое:
// USER
    public function shops(): BelongsToMany
    {
        return $this->belongsToMany(Shop::class);
    }

//PVZ
    public function shops(): BelongsToMany
    {
        return $this->belongsToMany(Shop::class);
    }

//SHOP
    public function users(): BelongsToMany
    {
        return $this->belongsToMany(User::class);
    }
    public function pvzs(): BelongsToMany
    {
        return $this->belongsToMany(Pvz::class);
    }


Я хочу из юзера получить пвз (те у юзера есть магазины, а у этих магаинов пвз)
Как такое сделать?
$user->pvz; // collection<Pvz::class>
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 1
Helldar
@Helldar
Just do it.
Можно двумя способами:

Первый, если от юзера нужно сразу получить список ПВЗ. Для этого необходимо в модели User добавить ещё один релейшен на ПВЗ используя релейшен "hasManyThrough". Таким образом, при вызове $user->pvzs будет возвращена коллекция.

Во втором случае нужно работать как с коллекциями. То есть от юзера получить магазины (shops), а от них пункты выдачи заказов. Если при этом нужен единый список, то получится следующий костыль:
$pvz = collect();

$user->shops->each(function (Shop $shop) use (&$pvz) {
    $pvz = $pvz->merge($shop->pvzs);
});

return $pvz->unique('id')->values();


При этом я не уверен что указанный ниже метод сработает правильно:
return $user->pluck('shops.pvzs')->unique('id')->values();
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы