从通知中检索模型

Retrieve model from notification

使用 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'))

这只会执行一个 SQL 查询。

深入研究 Laravel 数据库通知。 Laravel 样板通知可能适用于:

class User extends Model {
   // ...
   public function resourceNotifications() {
       $this->morphToMany(Resource::class, 'notifiable', 'notifications');
   }
}

然后检索所有相应的通知很简单:

$notifications = $user->resourceNotifications()->get();

虽然还没有测试那部分。