如何使用 morphtomany
How to use morphtomany
我正在尝试创建一个标签系统,现在我有两个 table 如下图
标签
可标记
我想根据 `tag_id 标记 Journal
和 id
。但是,日志总是在标记 table.
中创建新记录
这是我的模型关系
标签
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');
}
}
如果我没理解错的话,您正试图同时对期刊和购买使用标签。
那么你的 table 结构应该是这样的:
journals(id, ...)
purchases(id, ...)
tags(id, name)
taggables(id, tag_id, taggable_id, taggable_type)
然后可以标记的模型都应该有一个方法来检索它们的标记:
app/Journal.php
// namespace and use statements
class Journal extends Model
{
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
}
app/Purchase.php
// namespace and use statements
class Purchase extends Model
{
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
}
可以同时应用于 Purchase 和 Journal 的标签模型应该有 N 个方法,其中 N 是您通过多态关系连接的不同模型的数量,在本例中 N=2(一种检索方法从标签购买,以及一种从标签检索期刊的方法)。
app/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
注意: 定义关系使用相关 class 的 FQDN,例如:'App\Tag'
而不是 'Tag'
,否则class 不会被自动加载器找到。
我正在尝试创建一个标签系统,现在我有两个 table 如下图
标签
可标记
我想根据 `tag_id 标记 Journal
和 id
。但是,日志总是在标记 table.
这是我的模型关系
标签
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');
}
}
如果我没理解错的话,您正试图同时对期刊和购买使用标签。
那么你的 table 结构应该是这样的:
journals(id, ...)
purchases(id, ...)
tags(id, name)
taggables(id, tag_id, taggable_id, taggable_type)
然后可以标记的模型都应该有一个方法来检索它们的标记:
app/Journal.php
// namespace and use statements
class Journal extends Model
{
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
}
app/Purchase.php
// namespace and use statements
class Purchase extends Model
{
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
}
可以同时应用于 Purchase 和 Journal 的标签模型应该有 N 个方法,其中 N 是您通过多态关系连接的不同模型的数量,在本例中 N=2(一种检索方法从标签购买,以及一种从标签检索期刊的方法)。
app/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
注意: 定义关系使用相关 class 的 FQDN,例如:'App\Tag'
而不是 'Tag'
,否则class 不会被自动加载器找到。