Laravel:针对不同条件的查询构建器基础查询

在我的应用程序中,有一种情况我必须运行相同的查询 3 次,但每个查询都有一些不同的条件。例如:active:查询 + active conditions,inactive:查询 + inactive conditions。ETC。


这是我的代码:


$activeInventory = $inactiveInventory = \DB::table('device_inventories')

  ->where([

    'device_companies.company_id'  => session()->get('COMPANY_ID'),

    'device_inventories.device_id' => $Self->id,

  ])->select([

    ...

  ])

  ->join('devices', 'devices.id', '=', 'device_inventories.device_id')

  ->join('device_companies', 'device_companies.id', '=', 'devices.device_company_id');


// active records

$active = $activeInventory

  ->where('device_inventories.status', 'T')

  ->join('u_devices', 'u_devices.device_inventory_id', '!=', 'device_inventories.id')

  ->get() ?? null;


// inactive records

$inactive = $inactiveInventory

  ->where('device_inventories.status', 'F')

  ->get() ?? null;


// returning data

return [

  'model' => $Self,

  'active' => $active,

  'inactive' => $inactive,

];

u_devices请注意,我已在查询中加入表Active。但是当我运行Inactive查询时,join withu_devices也出现在该查询中。即使我使用不同的变量来存储基本查询并运行它。


我在这里做错了什么..?


婷婷同学_
浏览 147回答 2
2回答

MM们

这是由于附加查询逻辑的工作方式所致。当您将更改附加到查询的一个版本时,它会修改原始版本,因此来自基础的任何后续查询也会受到影响。您应该能够使它与clonePHP 中的关键字一起使用:$baseQuery = \DB::table('device_inventories')->where([  'device_companies.company_id'  => session()->get('COMPANY_ID'),  'device_inventories.device_id' => $Self->id,])->select([  ...])->join('devices', 'devices.id', '=', 'device_inventories.device_id')->join('device_companies', 'device_companies.id', '=', 'devices.device_company_id');$active = (clone $baseQuery)->where('device_inventories.status', 'T')->join('u_devices', 'u_devices.device_inventory_id', '!=', 'device_inventories.id')->get() ?? null;$inactive = (clone $baseQuery)->where('device_inventories.status', 'F')->get() ?? null;return [  'model' => $Self,  'active' => $active,  'inactive' => $inactive,];当您使用 时clone,您创建了查询的副本,因为它是您代码中的那个点,因此后续使用不会“污染”查询。

守候你守候我

您需要获取构建器对象的新实例。$activeInventory持有你告诉它的所有条件,其中包括所有条件where。您将需要构建器的副本对其执行不同的查询:$something = (clone $activeInventory)->...; $else = (clone $activeInventory)->...;
打开App,查看更多内容
随时随地看视频慕课网APP