3

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

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

  2. 每个模型都应该有一个类似“references”的函数来获取混合模型的集合。

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

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');
    }
}

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

4

2 回答 2

7

您可以通过添加 a来定义 abelongsTo使用关系:morphMany-stylewhere

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

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

希望有帮助!

于 2013-07-16T14:50:31.823 回答
1

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

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

您需要 Eloquent 的 morphMany() 目前不支持的多对多关系

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

于 2013-04-20T02:10:16.073 回答