我有一个用户表
+-------+------+-----+
| User | Sale | Sex |
+-------+------+-----+
| user1 | 120 | M |
| user2 | 98 | M |
| user3 | 5 | F |
+-------+------+-----+
在laravel中,我们通过以下语句查询:
$allMale = UserTable::where('Sex', 'M')->get();
在尝试再次查询同一个表时会发生什么
$allFemales = UserTable::where('Sex', 'F')->get();
$user1 = UserTable::where('User', 'user1')->get();
它会查询3次吗?可以查询一次,然后多次解析吗?
答案 0 :(得分:3)
是的,我不确定这里的UserTable是Builder还是Eloquent,但Eloquet是使用MySQL,所以它会运行3个不同的查询:
SELECT * FROM users WHERE Sex = 'M';
SELECT * FROM users WHERE Sex = 'F';
SELECT * FROM users WHERE User = 'user1';
当然你可以这样做:
$users = UserTable::where(function($q) {
$q->whereIn('Sex', ['M', 'F'])->orWhere('User', 'user1')
})->get();
这将生成查询:
SELECT * FROM users WHERE ((Sex IN ('M', 'F') OR USER = 'user1'))
现在您可以使用Laravel collection methods
从这样的变量中获取这些用户$allMale = $users->where('Sex', 'M')->get();
$allFemales = $users->where('Sex', 'F')->get();
$user1 = $users->where('User', 'user1')->get();
现在,假设user1已设置性别,您实际上可以使用:
$users = UserTable::whereIn('Sex', ['M', 'F'])->get();
此外,假设只有一个user1而不是:
$user1 = $users->where('User', 'user1')->get();
可能更好的解决方案是:
$user1 = $users->where('User', 'user1')->first();