【发布时间】:2020-01-20 13:41:51
【问题描述】:
我很长时间都在寻找这个问题的解决方案:
假设我们有 2 个表,一个表是 Clients 表,第二个表是 ClientAssignment 表: ClientAssignment 表与 Clients 表相关:
public function assignment()
{
return $this->hasOne(ClientAssignment::class, 'client_id');
}
现在当我想计算有多少 ClientAssignment 有客户时,我会这样做:
$users =[1,2,3,4 .....]
$userAssignments = array();
foreach ($users as $user) {
$user_assignments = Client::whereHas('assignment', function ($query) use ($user) {
$query->where('assigned_id', $user);
});
$ua['user_id'] = $user;
$ua['count'] = $user_assignments->count();
array_push($userAssignments, $ua);
}
代码运行良好,但在具有 80k 客户端的相对较小的表上,它的性能和查询执行时间约为 20 + 秒, 我的问题是否可以用另一种方法来做同样的事情,但性能和查询执行时间最低?
【问题讨论】:
-
第一件事,``` public function assignment() { return $this->hasOne(ClientAssignment::class, 'client_id'); } ``` 这应该是 ``` public function assignment() { return $this->hasMany(ClientAssignment::class, 'client_id'); } ```,
-
不,这不是一个好方法。我不确定你们的关系。但我更喜欢像 DB::table('assignment')->groupBy('user_id')->wereIn('user_id', [...])->where('client_id', 1)->count 这样的原始查询('id') 东西
-
第二件事,你不必使用eloquent,你可以运行一行sql,比如``` SELECT , (SELECT COUNT() FROM
assignmentWHEREassignment.client_id=clients.id) as assignmentCount FROMclients` ``` -
只需使用一个查询即可解决此问题。
-
那么
assigned_id,user有多个client_assignments,client有一个client_assignment呢?
标签: php mysql laravel laravel-5 eloquent