laravel调用未定义的方法addEagerConstraints()

时间:2018-09-27 02:50:12

标签: laravel eloquent

我有两个模型

Post.php

  

id

     

发布

     

show_id

     

type ='电影'或'电视'

Show.php

  

id //仅此自动递增计数器的ID
  show_id

     

show_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,它是电影或电视节目,我想限制它以匹配两侧的类型列

3 个答案:

答案 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->f2null

在此处了解更多信息: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_idshow_type字段。查看文档以获取更多信息,我不确定您项目的其余部分,因此我不确定100%是否适合,但是无论何时您开始在表中放置“ _type”字段,都应该询问您是否应该使用多态关系。当您意识到电影和电视节目以及如何处理它们之间还有其他差异时,这也可能使您的模型更整洁,并且没有一堆if语句。

https://laravel.com/docs/5.7/eloquent-relationships#polymorphic-relations

答案 2 :(得分:0)

我刚遇到一个包裹https://github.com/topclaudy/compoships 它可以做什么来基于多个FK创建关系,laravel默认情况下不支持