Php Laravel/Eloquent:在由Eloquent生成的sql语句中添加缺少的()

Php Laravel/Eloquent:在由Eloquent生成的sql语句中添加缺少的(),php,laravel,laravel-5,eloquent,Php,Laravel,Laravel 5,Eloquent,我正在执行以下请求以从数据库中提取一些数据。预期的结果是错误的,因为某些括号在SQL生成的请求中位置不正确: $data = Ov::with([ 'masters' => function ($query) use ($devicesArrayOnlyLKUAToZero) { $query->whereIn('macAddress', $devicesArrayOnlyLKUAToZero)

我正在执行以下请求以从数据库中提取一些数据。预期的结果是错误的,因为某些括号在SQL生成的请求中位置不正确:

$data = Ov::with([
            'masters' => function ($query) use ($devicesArrayOnlyLKUAToZero) {
                $query->whereIn('macAddress', $devicesArrayOnlyLKUAToZero)
                    ->orWhere('lastKnownUpAt','<>', '0');
            }
        ])->where('ovId', '=', $ovId)->get();
由Laravel生成的专用sql是:请参阅与Laravel debugbar的配合:

select * from `masterequipments` where `masterequipments`.`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个。我希望:

select * from `masterequipments` where `masterequipments`.`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')

你需要这样做:

    $data = Ov::with([
        'masters' => function ($query) use ($devicesArrayOnlyLKUAToZero) {
            $query->where(function ($query) use ($devicesArrayOnlyLKUAToZero) {
                $query->whereIn('macAddress', $devicesArrayOnlyLKUAToZero);
            })
                ->orWhere(function($query) {
                    $query->where('lastKnownUpAt','<>', '0');
                });
        }
    ])->where('ovId', '=', $ovId)->get();
这篇文章很好地解释了如何使用它来完成它

$data = Ov::with([
    'masters' => function ($query) use ($devicesArrayOnlyLKUAToZero) {
        $query->where(function ($query) use ($devicesArrayOnlyLKUAToZero) {
            $query->whereIn('macAddress', $devicesArrayOnlyLKUAToZero);
        })
        ->orWhere(function($query) {
            $query->where('lastKnownUpAt','<>', '0');
        });
    }
])->where('ovId', '=', $ovId)->get();
更新


这段代码生成以下sql语句:select*from`masterequipments`其中`masterequipments`.`id_ov_foreign_key`位于'38'中,macAddress`位于'e8:e7:32:c1:e6:48','00:e0:b1:fe:ef:a5','e8:e7:32:bc:a7:a7','2c:fa:10:79:74','e8:e7:e7:32:b9:6d:1d','00:e0:b1:ee:58:2d','00:e0:b1:9d:44',',‘00:e0:b1:72:34:86’、‘00:e0:b1:fe:ee:8d’、‘00:e0:b1:79:53:52’、‘e8:e7:32:98:80:22’、‘00:e0:b1:75:00:8a’或‘lastKnownUpAt’‘0’还有一个问题,它不是预期的语句。随着时间的推移,它会产生更多的结果expected@wawanopoulos:检查更新应答尚未正确。现在它产生了:在'38'中的'id_ov_foreign_key'和'e8:e7:32:c1:e6:48','e8:e7:32:bc:b0:94','e8:e7:32:e4:8e:68'中的'macAddress',从'masterequipments'中选择*,'e8:e7:32:bc:a7:70'或'lastKnownUpAt''0'而不是预期的语句:从'masterequipments'中选择*其中'masterequipments'。'38'中的'id\u ov\u foreign\u key'和'e8:e7:32:e6:48'中的'macAddress'、'e8:e7:32:bc:b0:94'、'e8:e7:32:e4:8e:68'、'e8:e7:32:Nubc:a7:70'或'0'确定,地点或'lastKnownUpAt',,“0”在何处获得输出?
$data = Ov::with([
    'masters' => function ($query) use ($devicesArrayOnlyLKUAToZero) {
        $query->where(function ($query) use ($devicesArrayOnlyLKUAToZero) {
            $query->whereIn('macAddress', $devicesArrayOnlyLKUAToZero);
        })
        ->orWhere('lastKnownUpAt','<>', '0');
    }
])->where('ovId', '=', $ovId)->get();