簡體   English   中英

Laravel 5.2 | 查詢多對多

[英]Laravel 5.2 | query many to many to one

目前,我正在從事一個多領域和語言的項目,其中視頻以不同的標題和描述重復使用。

我與此關系相關的表看起來像

posts    >-    videos    >-    videos_tags    -<    tags
id             id              id                   id
domain_id                      video_id             
video_id                       tag_id

當然,我已經創建了模型:具有所有必需關系的帖子,視頻和標簽。

我正在嘗試的事情是通過Tag模型獲取所有帖子,並維護pagination()功能。

我能夠通過視頻模型將所有標簽鏈接到帖子。 但是,當我嘗試反向方式時,我似乎並沒有保留pagination()功能。 我已經嘗試了很多,但似乎找不到正確的解決方案。

我與這段代碼最接近(我認為):

// App\Models\Tag
public function posts()
{
    $posts = [];

    foreach ($this->videos as $video)
    {
        foreach ($video->posts as $post)
        {
            if (!array_key_exists($post->id, $posts)) $posts[$post->id] = $post;
        }
    }


    return \Illuminate\Database\Eloquent\Collection::make($posts);
}

歡迎我在尋求答案時錯過的任何建議或文章:)

在問了這個問題之后,我立刻有一個尤里卡的時刻,找到了解決方案。 實現此目的的方法不是通過Tag模型獲取Post模型,而是通過Post模型本身。

這是我所做的:

// App\Models\Tag
public function posts()
{

    return Post

            ::select('posts.*')

            ->join('videos', 'posts.video_id', '=', 'videos.id')

            ->join('videos_tags', 'videos.id', '=', 'videos_tags.video_id')

            ->join('tags', 'videos_tags.tag_id', '=', 'tags.id')

            ->where('tags.id', $this->id);

}

這解決了在執行查詢之前查詢多對多關系並保持雄辯的功能的問題。

您可以在Posts模型上定義一個所謂的范圍。

class Post {
    /**
     * Limit query to posts related to a given tag id.
     * 
     * @param  Builder $query  The original query
     * @param  Integer $tag_id The tag id to filter for
     * @return Builder         The query with an additional where
     */
    public function scopeHasTag($query, $tag_id)
    {
        // assumes that there is a 'tags' relation
        return $query->whereHas('tags', function($tags_query) use ($tag_id) {
            return $tags_query->where('id', $tag_id);
        });
    }
}

該范圍使您可以執行如下查詢( hasTags是從scopeHasTags怪誕地派生的)。

$posts = Post::query()->hasTag(10);  // All posts related with tag id 10
return $posts->paginate();

這是有關查詢范圍的官方文檔: https : //laravel.com/docs/5.2/eloquent#local-scopes

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM