为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

PHP
婷婷同学_ 2023-05-26 17:45:12
在我的应用程序中,有一种情况我必须运行相同的查询 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 datareturn [  'model' => $Self,  'active' => $active,  'inactive' => $inactive,];u_devices请注意,我已在查询中加入表Active。但是当我运行Inactive查询时,join withu_devices也出现在该查询中。即使我使用不同的变量来存储基本查询并运行它。我在这里做错了什么..?
查看完整描述

2 回答

?
MM们

TA贡献1886条经验 获得超2个赞

这是由于附加查询逻辑的工作方式所致。当您将更改附加到查询的一个版本时,它会修改原始版本,因此来自基础的任何后续查询也会受到影响。您应该能够使它与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,您创建了查询的副本,因为它是您代码中的那个点,因此后续使用不会“污染”查询。


查看完整回答
反对 回复 2023-05-26
?
守候你守候我

TA贡献1802条经验 获得超10个赞

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

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


查看完整回答
反对 回复 2023-05-26
  • 2 回答
  • 0 关注
  • 189 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信