Laravel API 资源 whenLoaded 无法正常使用其他值
Laravel API resource whenLoaded not working properly with another values
我正在使用 API 资源,但我想添加一些额外的逻辑。
我有这个资源:
return [
'id' => $this->id,
'name' => $this->name,
'contacts' => $this->whenLoaded('contacts'),
'phone' => $this->whenLoaded('contacts',
$this->contacts->where('type', '=', 'phone')->first()
? $this->contacts->where('type', '=', 'phone')->first()->value
: null),
];
contacts
是一种关系 'one-to-many',其中有多种联系方式(phone、电子邮件等)。
然后我想添加 'phone' 属性 return phone 联系人。
这段代码工作正常,问题是属性 phone 总是被加载,即使 'contacts' 关系没有加载,这对性能来说非常糟糕,因为正在执行 N+1当我不需要 phone 属性时出现问题。
我是否使用了错误的 whenLoaded 方法?逻辑非常简单,当加载联系人关系时获取 phone 属性,否则不要这样做。
你的第二个参数在被发送到函数时被执行。所以解决方案是传递一个可调用对象。
你必须像这样构建它:
return [
'id' => $this->id,
'name' => $this->name,
'contacts' => $this->whenLoaded('contacts'),
'phone' => $this->whenLoaded('contacts', function() {
return object_get($this->contacts->where('type', 'phone')->first(), 'value');
})
];
我也使用 object_get()
添加了一些简化。
我正在使用 API 资源,但我想添加一些额外的逻辑。 我有这个资源:
return [
'id' => $this->id,
'name' => $this->name,
'contacts' => $this->whenLoaded('contacts'),
'phone' => $this->whenLoaded('contacts',
$this->contacts->where('type', '=', 'phone')->first()
? $this->contacts->where('type', '=', 'phone')->first()->value
: null),
];
contacts
是一种关系 'one-to-many',其中有多种联系方式(phone、电子邮件等)。
然后我想添加 'phone' 属性 return phone 联系人。
这段代码工作正常,问题是属性 phone 总是被加载,即使 'contacts' 关系没有加载,这对性能来说非常糟糕,因为正在执行 N+1当我不需要 phone 属性时出现问题。
我是否使用了错误的 whenLoaded 方法?逻辑非常简单,当加载联系人关系时获取 phone 属性,否则不要这样做。
你的第二个参数在被发送到函数时被执行。所以解决方案是传递一个可调用对象。
你必须像这样构建它:
return [
'id' => $this->id,
'name' => $this->name,
'contacts' => $this->whenLoaded('contacts'),
'phone' => $this->whenLoaded('contacts', function() {
return object_get($this->contacts->where('type', 'phone')->first(), 'value');
})
];
我也使用 object_get()
添加了一些简化。