如何基于Laravel模型访问器属性值执行whereRaw查询?
基于Laravel模型访问器结果实现查询的解决方案
你定义的status访问器是在PHP层面对数据库取出的数字值做转换,数据库里实际存储的还是0或1,所以直接用whereRaw("status like '%$search%'")是行不通的——数据库里的status是数字,根本匹配不上字符串搜索词。
下面给你两种可行的实现方案:
方案一:将搜索词映射为数据库存储的数值
根据搜索词判断对应的数据库状态值,直接查询原始字段:
$search = 'act'; $usersQuery = User::query(); $lowerSearch = strtolower($search); if (str_contains($lowerSearch, 'act')) { // 匹配Active,对应数据库的1 $usersQuery->where('status', 1); } elseif (str_contains($lowerSearch, 'nonact')) { // 匹配Nonactive,对应数据库非1的值 $usersQuery->where('status', '!=', 1); } $users = $usersQuery->get();
方案二:在SQL查询中直接转换状态值
用SQL的CASE语句在数据库层面完成状态值的转换,再做模糊匹配:
$search = 'act'; $users = User::whereRaw(" CASE WHEN status = 1 THEN 'Active' ELSE 'Nonactive' END LIKE ? ", ["%{$search}%"])->get();
这里用参数绑定?代替直接拼接变量,既避免了SQL注入风险,又能正确匹配转换后的字符串。
内容的提问来源于stack exchange,提问作者Levind Sein
相关产品推荐
相关产品推荐

