首页 > 解决方案 > Laravel:从数据库检索后将用户存储在存储库中以减少 MySQL 查询

问题描述

是否有一种既定的方法来存储您可能希望在内存/缓存中处理而不是进入数据库的模型?

我有带有created_byupdated_by列的模型,它们存储为Userid 的整数。我通常还会在前端显示创建每个模型的人的姓名。

假设登录用户与id列相同created_by。我将始终检查登录用户以进行身份​​验证,但在发送回 json 响应时,我不需要查询数据库两次以显示创建的用户名...

我有太多重复的查询获得相同的确切用户,这会减慢应用程序的速度。

这是 a 中方法的一个很好的用例UserRepository吗?我还没有使用存储库,但想知道是否有其他人遇到过这个问题并想出了一个好的解决方案。

以下是可能会查询多个用户的位置示例:

// CompanyController.php
public function update(Request $request, Company $company)
{
    // got user with ID = 1 here
    $user = Auth::user();

    if(!$user->can('update', $company)){
        return response(403); //deny user
    }

    $company->fill($request->all());
    $company->save();

    // got user with ID = 1 here again...
    // this model was created by the logged in user
    return response()->json($company->with('created_user'));
}

// App\Company.php
public function created_user()
{
    // get the user identified by ID in the created_by column
    return $this->belongsTo(App\User::class, 'created_by');
}

我在 Laravel 5.4 和 PHP 7.2

标签: mysqllaravel

解决方案


几年前,在查看 Laravel 对userstable 和sessions,cache表的查询(如果您为它们设置数据库驱动器)后,我自己也有相当多的困惑。

它是框架生命周期足迹,需要这些数据才能正常运行。

但是,如果您检查,这些查询最多需要 1-2 毫秒。我有一个拥有大量用户的项目,但老实说,这些查询从未影响性能,因为它们使用主键进行选择(主要是 id)。

我建议你评估taking down query time of a 2-3 millisecond query down to 1 millisecondvs managing and maintaining an extra mid-layer cache service

现在,如果你想实现一个中间缓存层来最小化 MySQL 的负载,那么 laravel 的原生选项cache可以永久保存/缓存你的集合或在特定时间段内。如果您想要更强大的功能,那么您可以尝试使用elasticsearchredis

我仍然要强调这样一个事实,即添加中间层缓存层是一种架构变化,它会带来维护时间和数据同步的开销。如果你在 Laravel 之外使用任何服务,请确保你有一个可靠的后备机制,这样如果服务关闭,你可以直接从 MySQL 加载数据。


推荐阅读