为数千条记录优化查询Eloquent laravel

时间:2017-11-09 14:40:40

标签: laravel eloquent

我在Laravel中查询有很多记录的问题,因为它太慢了。

我的表用户 4934 记录。

我有关系表,例如名为 user_relation_values 17482 记录。

我的表 20495 记录。

现在我从前端收到用户的 N ID,因此我可以收到1个ID或4934个ID或2000个ID或1000个ID,因此我不知道有多少个ID我会收到的。

我必须从收到的ids开始,返回模型用户与id的关系。

所以在我的后端我有这样的功能:

$users= $request->input('users');
$usersValues = array();
foreach ($users as $user){
   $o = User::find($owner['id']);
   $o->values;
   $owersProperties[] = $o;
}

我在“我的用户”模型中有关系:

public function values(){
        return $this->belongsToMany('App\Models\Values');
    }

我已将各种索引放在表上,但如果收到所有ID,则查询速度太慢。

如果我收到所有4934个ID,则查询时间超过20秒,但我读到有人在5秒钟内查询了数百万条记录。

如何优化我的表格或查询?

1 个答案:

答案 0 :(得分:0)

查看示例代码,您将循环查询用户( n 查询),然后也查询每个用户的值。这将发出指数数量的查询。相反,您应该查询用户并急切加载值关系。

如果您将一组用户ID作为输入,那么您可以将其传递给Eloquent的find()方法:

$users = User::find($request->input('users'));

如果你计划在循环中使用它,你也应该急切加载values关系:

$users = User::with('values')->find($request->input('users'));

这可以大大减少您发出的查询数量。