【问题标题】:Laravel: Filtering users where multiple tags are presentLaravel:过滤存在多个标签的用户
【发布时间】: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 中实现这一点?

【问题讨论】:

    标签: laravel search eloquent filtering relationship


    【解决方案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 标签的用户。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-26
    • 2020-01-26
    • 1970-01-01
    • 2019-10-04
    • 1970-01-01
    相关资源
    最近更新 更多