Как создать отношения между 3 моделями в Laravel? - PullRequest
0 голосов
/ 20 мая 2019

Схема SQL:

Бюллетени

  id increment

сделка

  id increment
  seller_id
  buyer_id

deal_items - предметы = бюллетени

  id increment
  title
  desc
  bulletin_id
  deal_id

Как получить строку сделки по идентификатору бюллетеня? В сыром SQL это выглядит так:

select `deals`.* from `deals` inner join `deals_items` on `deals_items`.`deal_id` = `deals`.`id` where `deals_items`.`bulletin_id` = 10572

Я пытался:

public function deals()
{
    return $this->hasManyThrough(DealItem::class,Deal::class, 'bulletin_id','dealid','id');
}

Но это кажется неправильным путем. Не могу найти правильный путь в документации по отношениям.

@ HCK показывает правильный путь.

но когда я выполняю $ bulletin-> deal () в шаблоне блэйда, я получаю пустую коллекцию сделок.

Когда просто $ bulletin-> deal - все хорошо, у нас есть коллекция предложений.

Я использую защищенный $ with = ['deals'] в своей модели бюллетеня, но что отличается от метода или свойства вызова? Почему с методом пустой результат?

Ответы [ 3 ]

1 голос
/ 20 мая 2019

@ Амарнасан был близко, но порядок внешних ключей был неправильным.Попробуйте это:

Deal.php

public function bulletins()
{
    return $this
        ->belongsToMany(Bulletin::class, 'deals_items', 'deal_id', 'bulletin_id')
        ->withPivot('title','desc');
}

Bulletin.php

public function deals()
{
    return $this
        ->belongsToMany(Deal::class, 'deals_items', 'bulletin_id', 'deal_id')
        ->withPivot('title','desc');
}

Из docs :

Как упоминалось ранее, для определения имени таблицы присоединяющейся таблицы взаимосвязей Eloquent объединит два связанных имени модели в алфавитном порядке.Однако вы можете переопределить это соглашение.Вы можете сделать это, передав второй аргумент методу belongsToMany:

return $this->belongsToMany('App\Role', 'role_user');

В дополнение к настройке имени присоединяемой таблицы, вы также можете настроить имена столбцов ключей таблицы с помощьюпередача дополнительных аргументов методу belongsToMany.Третий аргумент - это имя внешнего ключа модели, для которой вы определяете отношение, а четвертый аргумент - это имя внешнего ключа модели, к которой вы присоединяетесь:

return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');

Обновление

Когда вы получаете доступ к связи как метод: $bulletin->deals() вы получаете доступ к самой связи.Это вернет экземпляр \Illuminate\Database\Eloquent\Relations\BelongsToMany (в вашем случае).Здесь запрос еще не выполнен , поэтому вы можете продолжать добавлять ограничения к вашему запросу, например:

$bulletin
    ->deals()
    ->where('seller_id', 45) // <---
    ->skip(5) // <---
    -> ... (And so on)

Когда вы обращаетесь к нему как к динамическому свойству, вы уже выполняетезапрос, так что это будет возвращать Collection экземпляр.Это то же самое, что вызвать отношение как метод, а затем присоединить ->get() в конце, так что эти два эквивалента:

$bulletin->deals()->get()
// equals to:
$bulletin->deals

Проверьте этот другой ответ , он отвечает на вашвопрос.

1 голос
/ 22 мая 2019

модель сделок -

public function bulletins()
    return $this->belongsToMany(Bulletin::class, 'deals_items ', 'bulletin_id', 'deal_id');
}

модель бюллетеня: -

public function deals()
{
    return $this
        ->belongsToMany(Deal::class, 'deals_items',  'deal_id', 'bulletin_id',);
}
1 голос
/ 20 мая 2019

DealClass:

public function bulletins()
    return $this->belongsToMany('App\Bulletin', 'deals_items ', 'bulletin_id', 'deal_id')->withPivot('title','desc');
}

BulletinClass:

public function deals()
    return $this->belongsToMany('App\Deal', 'deals_items ', 'deal_id', 'bulletin_id')->withPivot('title','desc');
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...