Laravel/Eloquent:如何筛选以字母B开头的字符串列表?
解决Laravel中筛选以'B'开头字符串的问题
嘿,我来帮你搞定这个筛选问题!先看看你之前尝试的两种方法为啥没生效:
你的两种尝试的问题分析
- 第一种用
$kentekens->where('kenteken', 'LIKE', 'B%'):这里要注意,Eloquent集合的where方法和查询构造器的where不一样,集合的where是严格匹配值,不支持SQL的LIKE语法,所以这个写法在集合里行不通。 - 第二种用
filter的写法:问题出在$value是整个Kenteken模型实例,不是kenteken字段的值,你直接用strpos($value, 'B')其实是在检查模型对象本身,而不是字段内容,自然得不到正确结果。
两种正确的解决方案
方案1:在控制器层面直接数据库查询(推荐)
这种方式最高效,因为在数据库层面就完成筛选,避免把所有数据拉到内存再处理,尤其数据量大的时候优势明显。修改你的控制器代码,在查询构造器里直接加where条件:
public function create() { $kentekens = Kenteken::latest() ->where('created_at', '>=', Carbon::today()) ->where('kenteken', 'LIKE', 'B%') // 新增这行筛选条件 ->get(); return view('layouts.dashboard', compact('kentekens')); }
这样传到视图的$kentekens已经是筛选好的结果,直接用就行。
方案2:在视图里用集合筛选(适合必须在视图处理的场景)
如果因为某些原因要在视图里处理集合,修正filter的回调,访问模型的kenteken字段:
{{ $kentekens->filter(function ($item) { return strpos($item->kenteken, 'B') === 0; }) }}
如果你的PHP版本是7.4及以上,还可以用更简洁的箭头函数:
{{ $kentekens->filter(fn($item) => strpos($item->kenteken, 'B') === 0) }}
内容的提问来源于stack exchange,提问作者Jessey Fransen
相关产品推荐
相关产品推荐

