laravel - Laravel API 资源 whenLoaded 无法与其他值一起正常工作
问题描述
我正在使用 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
是一种“一对多”的关系,有多种联系方式(电话、电子邮件等)。
然后我想添加属性“电话”,它将返回电话联系人。
这段代码工作正常,问题是即使没有加载“联系人”关系,也总是加载属性电话,这对性能非常不利,因为当我不需要电话属性时正在做 N+1 问题。
我是否使用了错误的 whenLoaded 方法?逻辑很简单,当加载联系人关系时获取电话属性,否则不要这样做。
解决方案
您的第二个参数在发送到函数时被执行。所以解决方案是传递一个可调用的。
你必须像这样构造它:
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()
。
推荐阅读
- assembly - 在 0x000B8000 写入内存映射的 VGA 不会打印字符
- java - 软删除包位置
- vba - 从多个工作表中收集数据
- iterm2 - iTerm如何在拆分窗格的标题栏上显示完整路径
- c# - 控制台应用程序 (.NET Framework) 中的 AAD 登录提示 - 您可以使用 oauth2 *non v2.0* 端点吗?
- regex - 如何使用正则表达式一次捕获字符串的多个部分?
- javascript - 将对象数组发送到rails控制器时出现字符串化问题
- firebase - FIrebase setData kef-value 序列未保留
- twilio - Twilio + Airtable / 从聊天机器人收集数据
- c# - 如何测试返回 Ok(object) 的 ASP.NET Core 2.2 Web API GET IActionResult?