使用Laravel,我可以创建数据库通知。
假设我的通知是关于Resources(名为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;
}
但它很慢(每个通知一个查询)而不是Laravel。我更喜欢这样的东西:
foreach ($user->notifications as $notification) {
// Do something with resource information...
echo $notification->resource->name;
}
理想情况下,它希望有一些急切的加载。是否有一种优雅(或至少是工作)的方式来做到这一点?
答案 0 :(得分:1)
您可以通过执行以下操作将查询减少到一个:
Resource::whereIn('id', collect($user->notifications)->pluck('resource_id'))
这只会执行一次SQL查询。
深入研究Laravel数据库通知。 Laravel样板通知可以使用:
class User extends Model {
// ...
public function resourceNotifications() {
$this->morphToMany(Resource::class, 'notifiable', 'notifications');
}
}
然后检索所有相应的通知就像:
$notifications = $user->resourceNotifications()->get();
虽然没有测试过那部分。