我正在使用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中的联合,但视频和帖子表列不相等。 有什么建议吗?
答案 0 :(得分:1)
使用雄辩的力量。
创建模型文件(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();
答案 1 :(得分:0)
这是一种雄辩的风格来实现这一目标。假设我找到标签为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());