Laravel Eloquent:查询whereIn和orWhere非常慢

时间:2017-08-22 15:34:50

标签: laravel laravel-5 orm eloquent where-in

我正在进行当前查询以检索具有所有关系的“OV”对象。我最近添加了masterswireless中的函数来添加过滤器,但它会引入很长的延迟。

我使用whereIn和orWhere关闭的方式是否存在错误或问题?

注意:devicesArrayOnlyLKUAToZero var是一个包含macAddress列表的数组

$data = Ov::with([
    'ovLicenses',
    'masters'=> function ($query) use ($devicesArrayOnlyLKUAToZero) {
        $query->whereIn('macAddress', $devicesArrayOnlyLKUAToZero)->orWhere('lastKnownUpAt','!=', '0');
    },
    'masters.licenses',
    'masters.equipment',
    'masters.slaveEquipments.equipment',
    'wireless'=> function ($query) use ($devicesArrayOnlyLKUAToZero) {
        $query->whereIn('macAddress', $devicesArrayOnlyLKUAToZero)->orWhere('lastKnownUpAt','!=', '0');
    },
    'wireless.licenses',
    'wireless.equipment'
])->where('ovId', '=', $ovId)->get();

使用debugBar Laravel进行调试时,我会执行以下无线请求:

select * from `wirelessequipments` where `wirelessequipments`.`id_ov_foreign_key` in ('38') and `macAddress` in ('e8:e7:32:c1:e6:48', 'e8:e7:32:bc:b0:94', 'e8:e7:32:e4:8e:68', 'e8:e7:32:bc:a7:70', '00:e0:b1:fe:ef:a5', 'e8:e7:32:bc:a7:a4', '2c:fa:a2:10:79:74', 'e8:e7:32:b9:6d:1d', '00:e0:b1:ee:58:2d', '00:e0:b1:9d:2c:44', '00:e0:b1:b5:e6:00', '00:e0:b1:72:34:86', '00:e0:b1:fe:ee:8d', '00:e0:b1:79:53:52', '00:e0:b1:fe:f0:bd', '00:e0:b1:75:fa:8a', 'e8:e7:32:98:80:22', '00:e0:b1:75:00:8a') or `lastKnownUpAt` <> '0'

这个请求似乎是错误的,因为它返回了一组错误的结果。

2 个答案:

答案 0 :(得分:0)

如果您使用Laravel调试器,您将看到laravel eager loading运行两个查询,而您可以在一个连接中执行此操作,这比Laravel的急切加载要快得多。

希望这有帮助。

答案 1 :(得分:0)

将其中的In转换为普通联接可以解决问题。 仅在有限的数据范围(第二个参数)中使用whereIn。 仅在整数情况下,whereIntegerInRaw替代了whereIn,这真的非常快。