Laravel中如何按指定用户名数组筛选Form对象集合
问题解答:获取指定用户数组对应的Form对象
问题描述
- 开发环境:PHP + Laravel
- 需求:获取所有
userName属于指定用户数组的Form对象 - 示例数据:
- 用户数组:
$users = ["name1", "name2","name4"] - Forms数组:
$Forms = [ {_id: 1, title : "title1", userName : "name1" }, {_id: 2, title : "title2", userName : "name2" }, {_id: 3, title : "title3", userName : "name3" }, {_id: 4, title : "title4", userName : "name4" }, {_id: 5, title : "title5", userName : "name1" } ]
- 用户数组:
- 当前实现代码:
foreach ($users as $user) { $allForm = Forms::where('userName ', $user)->get(); }; - 问题:仅获取到第一个用户(name1)的2个对象,无法获取name2、name4对应的Form对象
解决方案
你现在的问题有两个:
- 循环里每次都会用新的查询结果覆盖
$allForm变量,哪怕循环正常执行,最后也只会保留最后一次查询的结果; where条件里的字段名'userName '多了个空格,数据库字段名应该是userName,带空格会导致后续循环的查询匹配不到数据,所以只拿到了第一次循环的结果。
最推荐的解决方法是直接用Laravel的whereIn方法,一次性查询所有符合条件的数据,效率更高代码也更简洁:
$users = ["name1", "name2","name4"]; $allForm = Forms::whereIn('userName', $users)->get();
这个方法会生成WHERE userName IN ('name1', 'name2', 'name4')的SQL语句,一次性把所有目标Form对象查出来。
如果非要用循环实现(不建议,多次查询数据库会降低性能),需要把每次查询的结果合并起来,而不是覆盖变量:
$users = ["name1", "name2","name4"]; $allForm = collect(); // 用Laravel集合来存储结果,方便合并 foreach ($users as $user) { // 注意去掉字段名里的多余空格 $userForms = Forms::where('userName', $user)->get(); $allForm = $allForm->merge($userForms); }; // 如需转成数组可以用all()方法 $allForm = $allForm->all();
内容的提问来源于stack exchange,提问作者Elodie Muller
相关产品推荐
相关产品推荐

