Laravel 雄辩地搜索相关模型的字段

Posted

技术标签:

【中文标题】Laravel 雄辩地搜索相关模型的字段【英文标题】:Laravel eloquent search on fields of related model 【发布时间】: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();

【问题讨论】:

【参考方案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();

【讨论】:

以上是关于Laravel 雄辩地搜索相关模型的字段的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 雄辩:用相关的新模型存储新模型

php Laravel雄辩获得最新的相关模型

Laravel 雄辩的复杂搜索查询问题

列表模型如何按 DOWN-VOTES 的数量排序到相关模型 - laravel,雄辩

两个多对多相关表之间的Laravel雄辩关系

在laravel 5.6中雄辩地返回null值