簡體   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