在多对多多态中搜索具有相同标签的所有行
Search all rows with the same tag in many to many polymorphic
我正在使用 Laravel 5 并且与我的标记系统有像这样的多对多多态关系。
posts
id - integer
name - string
videos
id - integer
name - string
url - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
现在,我要创建一个搜索页面来搜索具有相同标签的所有帖子和视频吗?我考虑过 MySQL 中的合并,但视频和帖子 table 列不相等。
有什么建议吗?
使用Eloquent的力量。
创建模型文件(Post.php
、Video.php
、Tag.php
)。
Post.php
class Post extends Eloquent {
public function tags()
{
return $this->belongsToMany('Tag');
}
}
Video.php
class Video extends Eloquent {
public function tags()
{
return $this->belongsToMany('Tag');
}
}
Tag.php
class Tag extends Eloquent {
public function posts()
{
return $this->belongsToMany('Post');
}
public function videos()
{
return $this->belongsToMany('Video');
}
}
您可以在 Laravel Eloquent Relationships 文档中阅读更多相关信息。
下一步,而不是 taggeables
创建两个数据透视表:第一个 post_tag
字段 tag_id
和 post_id
用于将帖子与标签连接起来,第二个 tag_video
使用字段 video_id
和 tag_id
将视频与标签连接起来。
最后,要获得所有具有相同标签 ID 的帖子和视频(比如 $tag_id),您可以这样做(如果您的 Post.php
模型确实包含 tags()
方法):
对于帖子:
$posts = Post::whereHas(`tags`, function($q) {
$q->where('id', '=', $this->id);
})->orderBy('name', 'ASC')->get();
对于视频:
$videos = Video::whereHas(`tags`, function($q) {
$q->where('id', '=', $this->id);
})->orderBy('name', 'ASC')->get();
这是实现此目的的 Eloquent 样式。假设我找到标签 id = 1;
的所有帖子和视频
$tag = Tag::with(['posts', 'videos'])->find(1);
$relations = $tag->getRelations();
$posts = $relations['posts']; // Collection of Post models
$videos = $relations['videos']; // Collection of Video models
$allRelations = array_merge($posts->toArray(), $videos->toArray());
我正在使用 Laravel 5 并且与我的标记系统有像这样的多对多多态关系。
posts
id - integer
name - string
videos
id - integer
name - string
url - string
tags
id - integer
name - string
taggables
tag_id - integer
taggable_id - integer
taggable_type - string
现在,我要创建一个搜索页面来搜索具有相同标签的所有帖子和视频吗?我考虑过 MySQL 中的合并,但视频和帖子 table 列不相等。 有什么建议吗?
使用Eloquent的力量。
创建模型文件(Post.php
、Video.php
、Tag.php
)。
Post.php
class Post extends Eloquent {
public function tags()
{
return $this->belongsToMany('Tag');
}
}
Video.php
class Video extends Eloquent {
public function tags()
{
return $this->belongsToMany('Tag');
}
}
Tag.php
class Tag extends Eloquent {
public function posts()
{
return $this->belongsToMany('Post');
}
public function videos()
{
return $this->belongsToMany('Video');
}
}
您可以在 Laravel Eloquent Relationships 文档中阅读更多相关信息。
下一步,而不是 taggeables
创建两个数据透视表:第一个 post_tag
字段 tag_id
和 post_id
用于将帖子与标签连接起来,第二个 tag_video
使用字段 video_id
和 tag_id
将视频与标签连接起来。
最后,要获得所有具有相同标签 ID 的帖子和视频(比如 $tag_id),您可以这样做(如果您的 Post.php
模型确实包含 tags()
方法):
对于帖子:
$posts = Post::whereHas(`tags`, function($q) {
$q->where('id', '=', $this->id);
})->orderBy('name', 'ASC')->get();
对于视频:
$videos = Video::whereHas(`tags`, function($q) {
$q->where('id', '=', $this->id);
})->orderBy('name', 'ASC')->get();
这是实现此目的的 Eloquent 样式。假设我找到标签 id = 1;
的所有帖子和视频$tag = Tag::with(['posts', 'videos'])->find(1);
$relations = $tag->getRelations();
$posts = $relations['posts']; // Collection of Post models
$videos = $relations['videos']; // Collection of Video models
$allRelations = array_merge($posts->toArray(), $videos->toArray());