Ларавель Красноречивая связь с сводной таблицей и условными обозначениями - PullRequest
0 голосов
/ 08 июня 2018

Нужно реализовать связь сводной таблицы в модели Eloquent, но я не уверен, возможно ли это.

Для иллюстрации предположим, что у нас есть система, которая отслеживает, какие фильмы и в каких кинотеатрах воспроизводятся.Также предположим, что в кинотеатрах могут быть рекламные скидки для снижения цены билета.Некоторые скидки могут иметь ограничения (минимальная цена билета или только фильмы с рейтингом G и т. Д.), И скидки могут или не могут комбинироваться.

Структура БД:

movies (id, title...)
theaters (id, name,...)
discounts (id, theater_id, discount_amount, min_price, can_combine)
theater_movies (id, movie_id, theater_id, ticket_price)
movie_discounts (id, movie_id, discount_id)

Модель Laravel TheatreMovie

class TheaterMovie extends Model
{
   public function discounts()
      return $this->hasManyThrough(
            Discount::class,
            MovieDiscount::class,
            'movie_id', // Foreign key on movie_discounts table...
            'id', // Foreign key on discounts table...
            'movie_id', // Local key on theater_movies table...
            'discount_id' // Local key on movie_discounts table...
        ) 
}

Но это не захват отношения theatre_movies.theater_id = discount.theater_id и в идеале также будет проверять ticket_price с min_price.

relation

1 Ответ

0 голосов
/ 08 июня 2018

Я думаю, что было бы проще использовать простые отношения на моделях Theatre и Movie, чем пытаться ввести класс TheaterMovie.

Так, например, на уроке Theatre у вас будут отношенияк таким фильмам:

public function movies()
{
    return $this->belongsToMany("App\Movie")->orderBy('name');
}

А затем, чтобы получить свои опорные точки, вы можете сделать аналогичные отношения, но добавить опорные точки прямо на модель Театра:

public function discounts()
{
    return $this->belongsToMany("App\Discount")->withPivot('discount_amount', 'min_price', 'can_combine')->orderBy('name');
}

Отсюда, когдаВы называете отношения из театральной модели, вы можете использовать опорные точки следующим образом:

$theater->pivot->discount_amount;

и так далее.Если хотите, вы можете поместить аналогичное (или даже такое же) соотношение скидок в таблицу фильмов, чтобы получить информацию из другой связанной модели.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...