Laravel与数据透视表和条件的雄辩关系

时间:2018-06-08 19:28:56

标签: laravel eloquent

希望在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 Theater电影模型

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...
        ) 
}

但这不是捕捉theater_movies.theater_id = discounts.theater_id关系,理想情况下也会检查ticket_price with min_price。

relation

1 个答案:

答案 0 :(得分:0)

我认为在剧院和电影模型上使用简单的关系可能更容易,而不是试图引入TheaterMovie课程。

例如,在剧院课上,你会像这样关注电影:

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;

等等。如果您愿意,可以在电影桌上放置类似(甚至相同)的折扣关系,这样您就可以从其他相关模型中获取信息。