2

当没有找到关系时,是否可以用空数组替换 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 []
    ]
  ]
]

正如我在文档(约束急切负载)中所读到的,只能通过约束急切负载来操作查询。

更新

合同类

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

2 回答 2

10

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

如果在hasMany关系上没有找到记录,Laravel 返回一个空数组。如果实现了hasOne关系,将返回 null。

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

class Contract extends Model
{

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

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

现有代码依赖于任何 Eloquent 关系的结果为 null、模型实例或模型实例的集合。但是,withDefault() 方法的当前功能打开了返回不是这三个预期值之一的对象的可能性。

如果你返回一个新的 \stdClass; 或一个空数组,则返回一个空的 web 实例。要获得一个空数组,只需实例化关系类的一个新对象。就我而言,新的 Web();。

于 2017-05-03T14:31:11.600 回答
-1

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

我检查了这个,所以当变量为空时它返回一个数组。

public class Contracts{

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

}
于 2017-05-03T09:33:48.487 回答