我的文章可以包含不同的标签。例如,5 块:(php、html、css、laravel、js) 我有也可以包含不同标签的组。例如 4 块:(laravel, php, html, css)
我已经定义了关系并且它有效。我还欠缺的是articel和群的链接。
如何显示组中标签匹配的所有帖子?
有人有想法或可以帮助我吗?
发布模型
public function groups()
{
return $this->belongsToMany('App\Group');
}
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
标签模型
public function articles()
{
return $this->morphedByMany('App\Article', 'taggable');
}
public function groups()
{
return $this->morphedByMany('App\Group', 'taggable');
}
团体模型
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
public function articles()
{
return $this->belongsToMany('App\Article');
}
自从您的问题更新以来,我发现人际关系中存在错误
将 article_group 表名称更改为 taggables。因为 laravel 正在根据其他表名执行某些任务。如果您仍然想使用article_group,那么您必须明确告诉laravel有关表名的信息。 阅读 HasRelationships.php (下面给出了完整路径)特征,然后你就会了解 laravel 如何自动链接它们。
/your_project/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/HasRelationships.php
是的 您的要求的解决方案是多对多多态关系
在这里阅读https://laravel.com/docs/5.6/eloquent-relationships#many-to-many-polymorphic-relations.
您将创建如下所示的 4 个表,然后在模型中创建关系
articles
id - integer
name - string
groups
id - integer
name - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
关系会是这样的:
class Article extends Model
{
public function tags()
{
return $this->morphToMany('App\Tag', 'taggable');
}
}
逆关系将是这样的:
class Tag extends Model
{
public function articles()
{
return $this->morphedByMany('App\Article', 'taggable');
}
public function groups()
{
return $this->morphedByMany('App\Group', 'taggable');
}
}
现在你可以获得这样的文章标签:
$article = App\Article::find(1);
foreach ($article->tags as $tag) {
//
}
将文章附加到群组如下:
$article = App\Article::find(1);
$group = App\Group::find(1);
$article->groups()->sync($group->id);
Read this for more https://laravel.com/docs/5.6/eloquent-relationships#updating-many-to-many-relationships
希望这能解决您的问题。