Laravel中与数据透视表的多态关系?

时间:2013-04-19 10:05:52

标签: laravel has-and-belongs-to-many laravel-4 polymorphism

我有3个模型,文章,建筑,人。

  1. 这些模型需要以几种方式相互引用。例如,建筑物需要能够引用Person的集合,例如$ building-> architects(),$ building-> owners(),文章可能引用Person的集合与$ article-> authors()和Person可能会引用像$ person-> owned_buildings()

  2. 这样的建筑集合
  3. 每个模型都应该有一个像“参考”这样的函数来获取混合模型的集合。

  4. 我认为应该可以通过以下方式实现:

    class Article extends Eloquent {
        public function referenceable()
        {
            return $this->morphTo();
        }
    
        public function authors()
        {
            return $this->morphMany('Person', 'referenceable');
        }
    }
    
    class Building extends Eloquent {
        public function referenceable()
        {
            return $this->morphTo();
        }
    
        public function architects()
        {
            return $this->morphMany('Person', 'referenceable');
        }
    }
    
    class Person extends Eloquent {
        public function referenceable()
        {
            return $this->morphTo();
        }
    
        public function owned_buildings()
        {
            return $this->morphMany('Building', 'referenceable');
        }
    }
    

    所以问题是数据透视表是什么样的?

2 个答案:

答案 0 :(得分:7)

您可以通过在混合中添加belongsTo来使用morphMany-style关系定义where

  public function followers() {
    return $this
      ->belongsToMany('User', 'follows', 'followable_id', 'user_id')
      ->where('followable_type', '=', 'Thing');
  }

where只会确保Eloquent不会与ID不匹配。

希望有所帮助!

答案 1 :(得分:1)

多态关系基本上是一对多的关系。它们允许您在许多其他模型上重用模型。

例如,如果Post有许多图像,并且用户可能有很多头像,则可以使用相同的图像模型而不会发生冲突。因此,您可以使用通用的imageable_id,而不是使用user_id字段和post_id字段设置图像。

你需要一个多对多的关系,目前Eloquent的morphMany()不支持

您可以为此执行多种类型的数据透视表。例如,使用building_id和person_id字段分别设置两个架构师/建筑物和所有者/建筑物枢纽表。 或者您可以设置一个带有额外“类型”字段的数据透视表来定义角色