在多对多的多态中搜索具有相同标记的所有行

时间:2015-02-09 06:07:44

标签: php mysql eloquent laravel-5

我正在使用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中的联合,但视频和帖子表列不相等。 有什么建议吗?

2 个答案:

答案 0 :(得分:1)

使用雄辩的力量。

创建模型文件(Post.phpVideo.phpTag.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_idpost_id,用于将帖子与标记相关联,第二个tag_video包含字段video_idtag_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());