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

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.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();

这是实现此目的的 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());