【问题标题】:Retrieve model from notification从通知中检索模型
【发布时间】: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


【解决方案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();

虽然还没有测试过那部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 2012-07-01
    • 1970-01-01
    • 2015-01-10
    相关资源
    最近更新 更多