【发布时间】:2018-08-30 15:58:43
【问题描述】:
使用 Laravel,我可以创建数据库通知。
假设我的通知是关于资源的(一个名为Resource 的模型),我可以给通知构造函数一个资源实例:
public function __construct(Resource $resource)
{
$this->resource = $resource;
}
// ...
public function toArray($notifiable)
{
return [
'resource_id' => $this->resource->id
];
}
我想为用户加载通知并显示一些资源信息。我可以获取所有通知并执行以下操作:
foreach ($user->notifications as $notification) {
$resource_id = $notification->resource_id;
$resource = Resource::find($resource_id);
// Do something with resource information...
echo $resource->name;
}
但它很慢(每个通知一个查询)而不是 la laravel。我更喜欢这样的东西:
foreach ($user->notifications as $notification) {
// Do something with resource information...
echo $notification->resource->name;
}
理想情况下,它希望有某种急切加载。有没有一种优雅(或至少有效)的方式来做到这一点?
【问题讨论】:
-
Resource::whereIn('id', collect($user->notifications)->pluck('resource_id'))可能会快一点,因为它只执行 1 个查询。但是仍然携带相同数量的数据。您可能会序列化通知中的所有数据,但这类似于缓存它们(这也是一种解决方案)。 -
谢谢!您可以将此作为答案发布(我会接受!)关于“但这类似于缓存它们”->我不想缓存结果,因为资源可以更改。无论如何,谢谢!
-
我相信 laravel 的 find 方法和关系访问默认执行“select *”。只有选择您需要的东西,您可能会获得性能提升。
标签: php laravel laravel-5 laravel-5.4