laravel:不同条件的查询生成器基查询

von4xj4u  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(395)

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

$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 查询加入 u_devices 也存在于该查询中。即使我使用不同的变量来存储基本查询并运行它。
我做错什么了。。?

vdgimpew

vdgimpew1#

这是由于附加查询逻辑的工作方式造成的。当您将更改附加到查询的一个版本时,它会修改原始版本,因此来自基的任何后续查询也会受到影响。你应该能把它和 clone php中的关键字:

$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 ,则按代码中该点的状态创建查询的副本,以便后续使用不会“污染”查询。

fquxozlt

fquxozlt2#

您需要获取生成器对象的新示例。 $activeInventory 保持你告诉它的所有条件,包括 where 条件。您将需要生成器的副本对其执行不同的查询:

$something = (clone $activeInventory)->...;
$else = (clone $activeInventory)->...;

相关问题