从通知中检索模型

时间:2018-03-21 13:40:09

标签: php laravel laravel-5 laravel-5.4

使用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;

}

理想情况下,它希望有一些急切的加载。是否有一种优雅(或至少是工作)的方式来做到这一点?

1 个答案:

答案 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();

虽然没有测试过那部分。