Laravel - 当找不到关系时,用空数组替换null

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)

Ila*_*ler 8

对于进一步的读者,这里解释如何解决这类问题.

如果在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();.