Laravel:在查询构建器上背靠背使用first()时出错

Kev*_*RED 1 php sql laravel

我的laravel项目中有以下代码

$config = DB::table('custom_config')->where('item_id', 5);
$cost = [
    'car_service_fee' => $config->where('managed_by', 1)->first()->service_fee,
    'bike_service_fee' => $config->where('managed_by', 2)->first()->service_fee
];
Run Code Online (Sandbox Code Playgroud)

我的custom_config表格如下.

+---------+------------+-------------+
| item_id | managed_by | service_fee |
|---------+------------+-------------|
|    5    |       1    |    8.5      |
|---------+------------+-------------|
|    5    |       2    |    2.0      |
+---------+------------+-------------+
Run Code Online (Sandbox Code Playgroud)

car_service_fee正在取得结果8.5

但我bike_service_fee正在恢复nullfirst()

如果它如下所示,相同的代码可以工作,

$cost = [
    'car_service_fee' => DB::table('custom_config')->where('item_id', 5)->where('managed_by', 1)->first()->service_fee,
    'bike_service_fee' => DB::table('custom_config')->where('item_id', 5)->where('managed_by', 2)->first()->service_fee
];
Run Code Online (Sandbox Code Playgroud)

first()存储在变量或laravel中的某个查询构建器上使用的背对背方法是否有任何问题?

谢谢

lag*_*box 5

$config是一个Query Builder对象.您在此对象上进行的大多数调用都是"构建"查询.该对象在where内部保留所有这些条件.当调用执行查询的方法时,它将编译查询,执行它并返回结果[调用firstget或...].构建器本身仍然作为构建器存在,可以继续构建,或者可以再次执行查询等.

在您的情况下,每次调用时,您都会where向此单个查询对象添加更多条件.$configwhere

您可以通过调用toSql构建器来查看生成的查询的外观,随时查看此行为.

您可以通过创建新的构建器对象或克隆来避免这种情况,$config这样您就可以构建2个单独的查询.

例:

$config = DB::table('custom_config')->where('item_id', 5);
$config2 = clone $config;

$cost = [
     'car_service_fee' => $config->where('managed_by', 1)->first()->service_fee,
     'bike_service_fee' => $config2->where('managed_by', 2)->first()->service_fee
];
Run Code Online (Sandbox Code Playgroud)

$config并且$config2都具有第一where条件.

如果你事后不需要这些构建器,你也可以直接克隆它们:

'car_service_fee' => (clone $config)->where(...)->first()->...,
'bike_service_fee' => (clone $config)->where(...)->first()->...,
Run Code Online (Sandbox Code Playgroud)