繁体   English   中英

Laravel多重枢纽关系

[英]Laravel multiple pivot relationship

我正在努力创建共享单个模型的两个枢轴之间的关系。

有问题的数据中心是item_tag和playlist_tag。 下面,我描述了表和已经创建的关系。

因此,我目前可以获取播放列表的项目,播放列表的项目,项目的标签,播放列表的标签。

我正在努力做的是:

  • 获取与给定播放列表共享相同标签的项目
  • 获取与给定项目共享相同标签的播放列表

我相信这可以通过“ manyThrough”完成,但老实说我迷路了。


更多关系细节

  • 播放列表可以包含许多项目
  • 项目可以属于许多播放列表
  • 所以item_playlist枢纽

标签可同时应用于播放列表和项目

  • 一个项目可以有很多标签
  • 标签可以应用于许多项目
  • 所以item_tag枢纽

  • 播放列表可以有很多标签
  • 标签可以应用于许多播放列表
  • 所以playlist_tag枢轴

表结构示例

   Table : items
    id
    name

    Table : playlists
    id
    name

    Table : item_playlist
    item_id
    playlist_id

    Table : tags
    id
    name

    Table : item_tag
    item_id
    tag_id

    Table : playlist_tag
    playlist_id
    tag_id

示例类/关系结构

class Playlist extends Model
{
    public function items()
    {
        return $this->belongsToMany(Item::class)->withTimestamps();
    }

    public function tags()
    {
        return $this->belongsToMany(Tag::class)->withTimestamps();
    }
}
...
class Item extends Model
{
    public function playlists()
    {
        return $this->belongsToMany(Playlist::class)->withTimestamps();
    }

    public function tags()
    {
        return $this->belongsToMany(Tag::class)->withTimestamps();
    }
}
...
class Tag extends Model
{
    public function items()
    {
        return $this->belongsToMany(Item::class)->withTimestamps();
    }

    public function playlists()
    {
        return $this->belongsToMany(Playlist::class)->withTimestamps();
    }
}

获取与给定播放列表共享至少一个标签的项目:

$tags = $playlist->tags()->pluck('id');
$items = Item::whereHas('tags', function($query) use($tags) {
    $query->whereIn('id', $tags);
})->get();

获取与给定播放列表共享所有标签的项目:

$tags = $playlist->tags()->pluck('id');
$items = Item::whereHas('tags', function($query) use($tags) {
    $query->whereIn('id', $tags);
}, '=', $tags->count())->get();

反向的工作方式相同。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM