Laravel:多次查询同一个表

时间:2018-06-15 17:42:18

标签: laravel laravel-5 eloquent laravel-collection

我有一个用户表

+-------+------+-----+
| 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次吗?可以查询一次,然后多次解析吗?

1 个答案:

答案 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();