Laravel:过滤存在多个标签的用户

Posted

技术标签:

【中文标题】Laravel:过滤存在多个标签的用户【英文标题】:Laravel: Filtering users where multiple tags are present 【发布时间】:2020-09-01 06:44:40 【问题描述】:

我页面上的所有用户都可以有多个标签。假设这些标签被标记为“A”、“B”和“C”。

通过我的搜索功能,我单击“A”以仅过滤掉具有“A”标签的用户。现在,我可以点击“B”来添加过滤,这样我就只想检索同时拥有“A”和“B”的用户。

这意味着仅应用了 ONE 标签的用户(“A”或“B”)将被排除在过滤结果之外。

为了简单起见,一共有三个表:users、tags、tag_binds

users
- id
- name

tags
 - id
 - name ("A", "B", "C" etc.)

tag_binds
- id
- tag_id
- user_id

如何在 Eloquent 中实现这一点?

【问题讨论】:

【参考方案1】:

user 表中使用HasManyThrough 就像这样:

用户模型:

public function tags() 
      return $this->hasManyThrough(
         'App\Tags',
         'App\TagBinds',
         'user_id',
         'id',
         'id',
         'tag_id'
      );
    

通过以下方式检索数据:

$searchdata = ['A','B']; //keep it as an array
if(count($searchdata) > 1) 
    $data = User::with('tags')
                      ->orWhereHas('tags', function($q) use ($searchdata)
                            $q->whereIn('name', $searchdata);
                      )->get();

 else 
    $data = User::with('tags')
                      ->orWhereHas('tags', function($q) use ($searchdata)
                            $q->where('name', 'LIKE', '%' . $searchdata[0] . '%');
                       )->get();


如果对你有帮助,请告诉我!

【讨论】:

谢谢。我试着按照你的建议去做。我认为这在某种程度上是正确的方法,但是我仍然得到只有“A”作为标签的 User1。但是,User2 同时具有“A”和“B”,而我只想检索这些用户。 这是否满足您的要求或有什么问题? 我正在寻找的是仅检索具有确切所选组合的用户。例如,如果我为过滤器选择“A”和“B”,那么查询必须只选择至少具有这两个标签的用户。所以它基本上是“选择具有标签'A'和标签'B'的用户”。希望这能澄清我的问题 :-) 并继续,如果我之后选择“C”,那么我只想检索带有 A + B + C 标签的用户。

以上是关于Laravel:过滤存在多个标签的用户的主要内容,如果未能解决你的问题,请参考以下文章

Larave中CSRF攻击

在 Laravel 中验证多个用户生成的标签

在laravel [实现过滤器]中将多个表与雄辩和急切的加载一起加入

Laravel:在多个值上过滤多对多

方法验证不存在 - Laravel 5.4

我想自学laraver,请诸位前辈给一些建议,谢谢