首页 > 解决方案 > 查找评论有多个标签。在多对多多态 laravel 关系中

问题描述

嗨,我正在尝试使用多对多多态,但不知何故它不起作用我无法在多对多多态关系中获得相关评论我想通过标签获得评论,由客户选择

表结构:

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 雄辩的关系多对多多态

标签: phplaravelmany-to-many

解决方案


您的查询中有错字。正确的形式 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;

推荐阅读