Ila*_*ler 2 php eloquent laravel-collection laravel-eloquent laravel-5.4
当没有找到关系时,是否可以用空数组替换null?
例如,客户有联系人和合同,但其中一个合同没有网络.
$customers = Customer::with('contacts', 'contracts.web')
->orderBy('company')->orderBy('prename')->get();
Run Code Online (Sandbox Code Playgroud)
结果如下......
2 => array:21 [
"id" => 1
"contacts" => array:2 [
0 => array:12 [
"id" => 1
"customer_id" => 1
]
1 => array:12 [
"id" => 2
"customer_id" => 1
]
]
"contracts" => array:2 [
0 => array:9 [
"id" => 1
"customer_id" => 1
"web" => array:7 [
"id" => 1
"contract_id" => 1
]
]
1 => array:9 [
"id" => 2
"customer_id" => 1
"web" => null // should be replaced with []
]
]
]
Run Code Online (Sandbox Code Playgroud)
正如我在文档(Constraining Eager Loads)中所读到的那样,只能通过约束预先加载来操纵查询.
UPDATE
合同类
class Contract extends Model
{
public function web()
{
return $this->hasOne(Web::class);
}
}
Run Code Online (Sandbox Code Playgroud)
对于进一步的读者,这里解释如何解决这类问题.
如果在hasMany关系上找不到记录,Laravel将返回一个空数组.如果实现了hasOne关系,则返回null.
因此,如果您在hasOne关系中找不到记录时也需要数组,则需要执行以下操作.
class Contract extends Model
{
public function web()
{
return $this->hasOne(Web::class)
->withDefault(function () {
return new Web();
});
}
}
Run Code Online (Sandbox Code Playgroud)
像这样实现它不可能只返回一个空数组.为什么这是不可能的,请在Laravel GitHub问题跟踪器上查看此问题.
现有代码依赖于任何Eloquent关系的结果,可以是null,Model实例或Model of Model实例.但是,withDefault()方法的当前功能打开了返回不是这三个预期值之一的对象的可能性.
如果你返回一个新的\ stdClass; 或者一个空数组,返回一个空的web实例.要获得一个空数组,只需实例化一个关系类的新Object.在我的情况下新的Web();.
| 归档时间: |
|
| 查看次数: |
3255 次 |
| 最近记录: |