我的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
正在恢复null
上first()
如果它如下所示,相同的代码可以工作,
$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中的某个查询构建器上使用的背对背方法是否有任何问题?
谢谢
$config
是一个Query Builder对象.您在此对象上进行的大多数调用都是"构建"查询.该对象在where
内部保留所有这些条件.当调用执行查询的方法时,它将编译查询,执行它并返回结果[调用first
或get
或...].构建器本身仍然作为构建器存在,可以继续构建,或者可以再次执行查询等.
在您的情况下,每次调用时,您都会where
向此单个查询对象添加更多条件.$config
where
您可以通过调用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)