2017-08-23 5 views
0

私のデータベースからいくつかのデータを抽出するために、次の要求を行っています。Laravel/Eloquent:雄弁に生成されたSQL文にmissing()を追加しました

$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' 

これは間違っているいくつかの括弧はよくSQLに配置されていないため、期待される結果は、要求を生成間違っています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') 

答えて

1

使用advanced where clausesをそれを説明します。

$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(); 

UPDATE

$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(); 
+0

コードのこの部分は、次のSQL文を生成する: ''( '38')で 'masterequipments'場合' masterequipments'.'id_ov_foreign_key' SELECT * FROMと( 'e8:e7:32:bc:a7:a4'、 '2c:e6:48'、'00:e0:b1:fe:ef:a5 ' e:58:2d、100:e0:b1:9d:2c:e2:10:79:74 '、e8:e7:32:b9:6d:1d、 「e0:b1:b5:e6:00」、「00:e0:b1:72:34:86」、「00:e0:b1:fe:ee:8d」、「00:e0: 「lastKnownUpAt' <> '0') '(b1:79:53:52 '、' e8:e7:32:98:80:22 '、'00:e0:b1:75:00:8a' 'まだ問題がある、それは期待されているステーメルではないent。それはより多くの結果を期待どおりに生成します – wawanopoulos

+0

@wawanopoulos:チェック* UPDATE *答え –

+0

まだまだ良いです。これは次のようになります: '' masterequipments''が '' masterequipments''_id_ov_foreign_key''( '38')と '' macAddress''('e8:e7:32:c1:e6:48 '、'e8: 'lastKnownUpAt' <>' 0 '');または 'lastKnownUpAt' <>' 0 ''( 'e7:32:bc:b0:94' 'e8:e7:32 e4:8e:68' e8 e7:32 bc a7:70 ' ( 'e8:e7:32:c1:e6:48'の 'macAddress'、 'e8:e7:32') 'を選択すると、 'lastKnownUpAt' <>' 0 ');または' lastKnownUpAt' <> '0':e8:e7:32:bc:b0:94 '' e8:e7:32:e4:8e:68 '' e8:e7:32:bc: ) '' – wawanopoulos

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

この記事では、それを達成するために十分http://laraveldaily.com/and-or-and-brackets-with-eloquent/

関連する問題