Laravel:从数据库中检索用户以减少MySQL查询后将用户存储在资源库中

时间:2019-02-18 19:30:07

标签: mysql laravel

是否存在一种确定的方式来存储您可能要在内存/缓存中处理的模型,而不是去数据库?

我有带有created_byupdated_by列的模型,这些列存储为User id的整数。我通常还会在前端显示创建每个模型的人员的姓名。

说登录的用户与id列具有相同的created_by列。我将始终检查登录用户的身份验证,但在向后发送json响应时,我不需要查询数据库两次也可以显示创建的用户名...

我遇到太多重复查询,无法获得完全相同的用户,这使应用程序运行缓慢。

这是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

3 个答案:

答案 0 :(得分:0)

我遇到了同样的问题,没有太多时间为每个模型编写自己的存储库,因此发现https://github.com/AuthentikCanada/eloquent-cache/软件包非常易于使用。您只需在模型中添加一个特征即可开始缓存查询。

答案 1 :(得分:0)

Laravel的Cache门面可以包装一些不同的缓存驱动程序(可以轻松设置memcache或Redis)。

这是config / cache.php的内存缓存示例:

!joi.object({ host: joi.string().required() }).validate({ host: 'example.com' }).error;
// returns true

!joi.object({ host: joi.string().required() }).validate({ nohost: 'example.com' }).error
// returns false

!joi.object({ host: joi.string().required() }).validate(new URL('http://example.com/')).error;
// this throws an exception!
// TypeError: Cannot read property 'host' of undefined
// WTF???

要存储一些东西:

URL

要检索某事:

'memcached' => [
    [
        'host' => '127.0.0.1',
        'port' => 11211,
        'weight' => 100
   ],
],

答案 2 :(得分:0)

几年前,我在查看Laravel对users表和sessionscache表的查询(如果您已为其设置数据库驱动器)后感到有些困惑。

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

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

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

现在,如果要实现中间缓存层以最大程度地减少来自MySQL的负载,则可以使用laravel cache的本机选项,它们可以永久或在一定时间段内保存/缓存您的集合。如果您想要更强大的功能,则可以尝试使用elasticsearchredis

我仍然要强调这样一个事实,添加中间层缓存层是一项体系结构更改,将伴随维护时间和数据同步开销。如果要在Laravel之外使用任何服务,请确保具有可靠的后备机制,以便在服务关闭时可以直接从MySQL加载数据。