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

Laravel - replace null with empty array when no relation is found

是否可以在找不到关系时用空数组替换null?

例如客户有联系人和合同,但其中一份合同没有网站。

$customers = Customer::with('contacts', 'contracts.web')
        ->orderBy('company')->orderBy('prename')->get();

结果如下...

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 []
    ]
  ]
]

正如我在文档中读到的那样 (Constraining Eager Loads),只能通过限制预加载来操作查询。

更新

合同class

class Contract extends Model
{
    public function web()
    {
        return $this->hasOne(Web::class);
    }
}

你的关系方法应该是解决这个问题的方法,因为这是你可以解决这个问题的第一个地方

我检查了这个,所以它 returns 当变量为 null 时是一个数组。

public class Contracts{

  public function web(){
    $collection = $this->hasMany('App\Web');
    return  $collection ? $collection : [];
  }

}

对于更多的读者,这里有一个解释如何解决这类问题。

如果在 hasMany 关系上找不到记录,

Laravel returns 一个空数组。如果实现 hasOne 关系,null 将被 returned.

因此,如果在 hasOne 关系上没有找到记录,您还需要一个数组,则需要执行以下操作。

class Contract extends Model
{

    public function web()
    {
        return $this->hasOne(Web::class)
            ->withDefault(function () {
                return new Web();
            });
    }
}

像这样实现它不可能只是 return 一个空数组。为什么这不可能,请查看 Laravel GitHub 问题跟踪器上的 this 问题。

There is existing code that depends on the result of any Eloquent relationship to either be null, a Model instance, or a Collection of Model instances. However, the current functionality of the withDefault() method opens up the potential for returning an object that is not one of those three expected values.

如果你return一个新的\stdClass;或一个空数组,一个空的 web 实例被 returned。要获得空数组,只需实例化关系 class 的新对象。在我的例子中 new Web();.