検索レビューには複数のタグがあります。多対多の多形Laravel関係で

Aug 22 2020

こんにちは私は多対多のポリモーフィックを使用しようとしていますが、どういうわけかそれは機能しません多対多のポリモーフィックな関係で関連するレビューを取得できませんでした私は顧客によって選択されたタグでレビューを取得したい

テーブル構造:

review
> id - integer
> name - string

tags
> id - integer
> name - string

taggables
> tag_id - integer
> taggable_id - integer
> taggable_type - string

モデル:

class Tag extends Eloquent
{
    public function reviews()
    {
        return $this->morphedByMany(Review::class, 'taggable'); } } class Review extends Eloquent { public function tags() { return $this->morphToMany(Tag::class, 'taggable');
    }
}

顧客からのリクエスト[tag_id_1、tag_id_2、tag_id_3、tag_id_4]

タグの[1、2、3、4、5]配列のようなリクエスト-キー

このタグに関連するレビューがレビューを見つけて取得した場合、私はそのようなものを試しました

返品関連のレビューのコード:

return Review::join('taggables', 'taggables.taggable_id', '=', 'reviews.id')
        ->where('taggables.taggable_type', '=', Review::class)
        ->whereIn('taggables.tag_id', [1, 2, 3, 4, 5])
        ->groupBy('reviews.id')
        ->orderBy('name', 'asc')
        ->get();

または:

Review::WhereHas('tags', function ($query) { $query->whereIn('tags_id', [1, 2, 3, 4, 5]);
    })->get();

私が必要とする結果:これらのタグが必要な唯一のレビュー

review:{
name: "Review",
tags :[1, 2, 3, 4, 5]
}

Laravelの雄弁な関係多対多多型

回答

user3532758 Aug 22 2020 at 15:58

すべてのタグを含むレビューが必要な場合、これはそれを行う1つの方法です。

$tagIds = [1,2,3,4,5]; $reviews = Review::query();
foreach($tagIds as $id){
 $reviews->whereHas('tags', function($query) use ($id) { return $query->where('id', $id); }); } $reviewsWithAllThoseIds = $reviews->get(); 

//if you don't want to use foreach.
collect($tagIds)->each(function($id) use ($reviews){
    $reviews->whereHas('tags', function($q) use ($id) { return $q->where('id', $id);
    });
});

これにより、配列にIDを持つすべてのタグを含むレビューが表示されます。

mohammadrezakhalifeh Aug 22 2020 at 15:04

クエリにタイプミスがあります。正しい形式はであるtaggables.tagable_id必要がありますtaggables.taggable_id。これが問題かどうかはわかりませんが、以下のようにコードを書くことをお勧めします。

レビューモデルでは、次のような関係を定義します。

public function tags()
{
    return $this->morphToMany(Tag::class, 'taggable','taggables','taggable_id','tag_id');
}

タグモデルでは、次のような関係を定義します。

public function reviews()
{
    return $this->morphedByMany(Review::class, 'taggable','taggables','tag_id','taggable_id');
}

特定のタグのレビューを返したい場合は、次のようにします。

$tag=Tag::find(1); $tagReviews=$tag->reviews;