如何使用morphtomany

问题描述 投票:0回答:2

我正在尝试创建一个标记系统,现在我得到了两个表,如下图所示

标签

标签

我想根据 `tag_id 标记

Journal
id
。但是,日志总是在 taggables 表中创建新记录。

这是我的模型关系

标签

class Tag extends Model
    {
       public function purchases()
        {
        return $this
            ->morphedByMany('Purchase', 'taggable');
        }

       public function taggables()
       {
        return $this->hasMany('Taggable');
       }

    }

购买

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

期刊

class Journal extends Model
{
    public function tags()
    {
        return $this
            ->morphToMany('Tag', 'taggable');
    }
}
laravel eloquent laravel-4 polymorphism many-to-many
2个回答
0
投票

如果我理解正确,您正在尝试同时使用日记和购买标签。

那么你的表结构应该是这样的:

期刊(id,...)
购买(id,...)
标签(id,名称)
可标记对象(id,tag_id,taggable_id,taggable_type)

那么可以标记的模型都应该有一个方法来检索它们的标签:

应用程序/Journal.php

// namespace and use statements

class Journal extends Model
{
    public function tags()
    {
        return $this->morphToMany('App\Tag', 'taggable');
    }
}

应用程序/Purchase.php

// namespace and use statements

class Purchase extends Model
{
    public function tags()
    {
        return $this->morphToMany('App\Tag', 'taggable');
    }
}

可应用于购买和日记的标签模型应该有 N 个方法,其中 N 是通过多态关系连接的不同模型的数量,在本例中 N=2(一种从标签检索购买的方法) ,以及一种从标签检索日记的方法)。

应用程序/Tag.php

// namespace and use statements

class Tag extends Model
{
    public function journals()
    {
        return $this->morphedByMany('App\Journals', 'taggable');
    }

    public function purchases()
    {
        return $this->morphedByMany('App\Purchase', 'taggable');
    }
}

设置关系后,您可以检索分配给日记或购买的标签:

$journal = \App\Journal::first();

foreach ($journal->tags as $tag) {
    // ...
}

或检索链接到特定标签的所有日记或购买:

$tag = \App\Tag::first();

// $tag->journals will contain the journals model instances linked to the current tag
// $tag->purchases will contain the purchases model instances linked to the current tag

注意:定义关系时使用相关类的FQDN,例如:

'App\Tag'
而不是
'Tag'
,否则自动加载器将找不到该类。


-2
投票

888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 8888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888 888888888888888888888888888888888888888888888

© www.soinside.com 2019 - 2024. All rights reserved.