【问题标题】:Laravel eloquent search on fields of related modelLaravel 雄辩地搜索相关模型的字段
【发布时间】:2015-05-08 21:32:59
【问题描述】:

我有一个雄辩的模型,

用户:用户(id、用户名、密码、电子邮件、状态)

个人资料:个人资料(id、user_id、first_name、last_name、gender、dob)

在控制器逻辑中,我急切地加载 Profile 模型。

我能做到,

$user = User::with('Profile')->get();

或

$user = User::with('Profile')->where('status', '1')->get();

但是如何做类似的事情,

$user = User::with('Profile')->where('status', '1')->where('gender', 'Male')->get();

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    这就是whereHas 派上用场的地方:

    $user = User::with('Profile')->where('status', 1)->whereHas('Profile', function($q){
        $q->where('gender', 'Male');
    })->get();
    

    基本上它添加了用户需要拥有gender = Male的个人资料的条件

    【讨论】:

    • 如果我需要对相关配置文件表执行“或在哪里”操作,我该怎么做? $q->orWhere('gender', 'Male') 会起作用吗?
    • 可能你想要orWhereHas('Profile', ...
    • 谢谢,再问一个问题,如果我需要两个或更多“或在哪里”条件,则在闭包方法中,以下代码不起作用。 orWhereHas('Profile', function($q){ $q->Where('field3', 'like', '%value%'); $q->orWhere('field4', 'like', '%value %'); })
    • 我不明白为什么这不起作用。有什么问题?
    • 它返回所有值而不过滤,但是如果我使用 orWhereHas() 方法两次,每个 orWhereHas() 方法具有不同的 $q->where() 条件,它工作得很好。
    【解决方案2】:

    如果你想在关系模型中搜索多个列。

            $searchText = 'test text';
            Product::with('owner')->where(function($query) use ($searchText)
            {
                $query->where('product_name', 'LIKE', '%' . $searchText . '%');
    
                $columns = ['product_code', 'place_location', 'remark'];
    
                foreach ($columns as $column ) {
                    $query->orWhere($column, 'LIKE', '%' . $searchText . '%');
                }
    
                $query->orWhereHas('owner', function($q) use ($searchText) {
                    $q->where(function($q) use ($searchText) {
                        $q->where('name', 'LIKE', '%' . $searchText . '%');
                        $q->orWhere('company_name', 'LIKE', '%' . $searchText . '%');
                    });
                });
    
            });
    

    【讨论】:

      【解决方案3】:

      假设你有多个关系

      并且您想根据多个关系列值搜索记录

                  User::with('associate')
                  ->where('name', 'like', '%' . $input . '%')
                  ->orWhere(function ($query) use ($input) {
                      $query->whereHas('associate', function ($q) use ($input) {
                          $q->where('first_name', 'like', '%' . $input . '%');
                      });
                  })
                  ->orWhere(function ($query) use ($input) {
                      $query->with('roles')->whereHas('roles', function ($q) use ($input) {
                          $q->where('display_name', 'like', '%' . $input . '%');
                      });
                  })
                  ->get();
      

      【讨论】:

        猜你喜欢
        • 2017-06-28
        • 2019-02-12
        • 1970-01-01
        • 2021-05-12
        • 2021-08-11
        • 2013-06-04
        • 2016-11-26
        • 2020-03-19
        • 2017-09-23
        相关资源
        最近更新 更多