【问题标题】:Laravel: Query builder base query for different conditionsLaravel:针对不同条件的查询构建器基础查询
【发布时间】:2020-10-05 04:30:12
【问题描述】:

在我的应用程序中,我必须运行相同的查询 3 次,但每个查询都有一些不同的条件。例如:active:查询+active conditionsinactive:查询+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,
];

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

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

【问题讨论】:

    标签: php sql laravel query-builder base


    【解决方案1】:

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

    $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 时,您会在代码中创建查询的副本,因此后续使用不会“污染”查询。

    【讨论】:

      【解决方案2】:

      您需要获取构建器对象的新实例。 $activeInventory 包含您告诉它的所有条件,其中包括所有 where 条件。您将需要构建器的副本来对其进行不同的查询:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-09
        • 2012-12-20
        • 2021-09-25
        • 2019-01-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-01
        相关资源
        最近更新 更多