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();.
是否可以在找不到关系时用空数组替换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();.