多态多对多关系

时间:2014-01-03 19:48:32

标签: php laravel-4 many-to-many eloquent polymorphism

我无法将多对多关系中的相关模型保存到数据库中。

$photo = Photo::find(1);
$photo->articles()->attach(2);

这样的东西不起作用并给出

  

错误:调用未定义的方法   照亮\数据库\查询\生成器::物品()'

如何正确地做到这一点?

模型

class Tag extends Eloquent
{
    public function articles()
    {
        return $this->morphedByMany('Article', 'taggable');
    }

    public function photos()
    {
        return $this->morphedByMany('Photo', 'taggable');
    }
}
class Article extends Eloquent
{
    public function tags()
    {
        return $this->morphToMany('Tag', 'taggable');
    }
}

class Photo extends Eloquent
{
    public function tags()
    {
        return $this->morphToMany('Tag', 'taggable');
    }
}

2 个答案:

答案 0 :(得分:3)

最后得到它的工作......基本上它是多态性+多对多关系的组合。我以为它不需要标签表。 Taggables表充当数据透视表,标签是包含基于数据透视表(taggables表)连接模型的Tag对象的表

答案 1 :(得分:0)

变形不支持多对多,它实际上是一对一关联,它用于创建不同模型之间的关系,例如,如果您有标记模型,标记模型可以涉及到许多不同的场合,它可能与页面模型,后期模型,产品模型等有关,它实际实现的是它允许您与其他模型相关联而无需明确定义数据库级别中的相关模型,例如标签模型可以与Post Model关联,但是您需要在db中定义一个post_id外键,您可以将该多态关系与该Post Model相关联,而无需将DB级别的模型定义为特定字段:

  

多态关系允许模型在单个关联上属于多个其他模型

在Django文档中,您可以清楚地看到此关联的工作原理:

staff
    id - integer
    name - string

orders
    id - integer
    price - integer

photos
    id - integer
    path - string
    imageable_id - integer
    imageable_type - string

上面的关联是:1照片与1其他模型相关,但具体实现不同* 因此照片可以属于工作人员,或者它可以属于订单。