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 雄辩地搜索相关模型的字段的主要内容,如果未能解决你的问题,请参考以下文章