我有两个模型
Post.php
id
发布
show_id
type ='电影'或'电视'
Show.php
id //仅此自动递增计数器的ID
show_idshow_type ='电影'或'电视'
放映的东西可以是电视或电影,可能两个具有相同show_id的示例,例如一台电视的show_id可以是10,也可以是一部电影,但是类型是不同的
我有后期模型
public function show(){
return $this->belongsTo('App\Show', 'show_id');
}
在展示模型中
public function post(){
return $this->hasMany('App\Post', 'id');
}
这种关系获得的第一个节目具有它所看到的匹配的节目ID,它是电影或电视节目,我想限制它以匹配两侧的类型列
答案 0 :(得分:1)
post.php:
public function show() {
return $this->belongsTo('App\Show', 'show_id', 'show_id')
->where('type', $this->type);
}
show.php
public function posts() {
return $this->hasMany('App\Post', 'show_id', 'show_id')
->where('type', $this->show_type);
}
当急于加载关系时,尝试使用where子句(如下面的示例)将不起作用,因为在处理关系时
$this->f2
为null
。
在此处了解更多信息:Compoships
答案 1 :(得分:0)
我认为您正在寻找的是多态关系。与其拥有可能是两个“类型”之一的模型,不如在同一个关系上应该有两个单独的模型。例如:
class Post
{
public function Show()
{
return $this->morphTo();
}
}
class TvShow
{
public function Post()
{
return $this->morphMany('App\Post', 'show');
}
}
class Movie
{
public function Post()
{
return $this->morphMany('App\Post', 'show');
}
}
然后,您的帖子表将包含与电视节目或电影相关的show_id
和show_type
字段。查看文档以获取更多信息,我不确定您项目的其余部分,因此我不确定100%是否适合,但是无论何时您开始在表中放置“ _type”字段,都应该询问您是否应该使用多态关系。当您意识到电影和电视节目以及如何处理它们之间还有其他差异时,这也可能使您的模型更整洁,并且没有一堆if语句。
https://laravel.com/docs/5.7/eloquent-relationships#polymorphic-relations
答案 2 :(得分:0)
我刚遇到一个包裹https://github.com/topclaudy/compoships 它可以做什么来基于多个FK创建关系,laravel默认情况下不支持