Laravel 5.1中如何判断记录存在并返回布尔值用于表单对比
解决Laravel 5.1中判断记录是否存在并返回布尔值的问题
嘿,我来帮你搞定这个问题!首先,Laravel其实已经为我们提供了非常高效的方法来判断数据库中是否存在符合条件的记录,完全不用先拉取所有数据再手动判断,而且能轻松解决你提到的字符串字段的判断问题。
核心优化:用exists()直接获取布尔值
你之前用get()获取整个数据集再判断的方式,不仅效率低(数据库要返回所有匹配的记录),还要额外处理集合。Laravel的查询构造器自带的exists()方法会直接生成EXISTS SQL查询,数据库只返回是否存在的布尔值,这才是最优解。
比如你原来的代码可以改成这样:
public function getSend() { if ($this->request->role == 1) { // 直接判断是否存在符合条件的记录,返回布尔值 $hasMatchingRecord = Cv::where('cv.pub', $this->request->pub) ->exists(); // 这里$hasMatchingRecord就是true(存在)或false(不存在) dd($hasMatchingRecord); return view('gestione.' . $this->view_namespace . '.send.pagina'); } }
解决字符串字段的判断问题
你提到用->where('cv.something','==',$this->request->something)无效,这是因为Laravel的where方法语法搞错了:
- 正确的语法是
where('字段名', '操作符', '值'),默认操作符是=,所以你不需要写==(数据库的等于操作符是=,不是==) - 所以针对字符串字段,直接写
->where('cv.something', $this->request->something)就可以,或者明确指定操作符->where('cv.something', '=', $this->request->something)
如果你的需求是把字符串字段的值转换成布尔值再判断(比如字段存的是'true'/'false'或者'yes'/'no'),可以结合数据库的类型转换函数来实现,比如MySQL下:
public function getSend() { if ($this->request->role == 1) { // 把请求中的值转成对应的布尔等价数值 $targetBoolValue = $this->request->something === 'true' ? 1 : 0; // 用whereRaw把数据库中的字符串字段转成数值后比较 $hasMatchingRecord = Cv::where('cv.pub', $this->request->pub) ->whereRaw("CAST(cv.something AS UNSIGNED) = ?", [$targetBoolValue]) ->exists(); dd($hasMatchingRecord); return view('gestione.' . $this->view_namespace . '.send.pagina'); } }
如果是PostgreSQL数据库,类型转换可以写成CAST(cv.something AS BOOLEAN),根据你用的数据库调整即可。
额外提示
- 如果你需要判断记录不存在,可以用
doesntExist()方法,用法和exists()完全一样 - 这种方式完全替代了嵌套if判断集合的写法,代码更简洁,性能也更好
内容的提问来源于stack exchange,提问作者Ivor92
相关产品推荐
相关产品推荐

