是否存在一种确定的方式来存储您可能要在内存/缓存中处理的模型,而不是去数据库?
我有带有created_by
和updated_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
答案 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
表和sessions
,cache
表的查询(如果您已为其设置数据库驱动器)后感到有些困惑。
这是框架生命周期的足迹,需要使这些数据正常运行。
但是,如果您进行检查,这些查询最多需要1-2毫秒。我有一个项目,其中有大量用户,但老实说,这些查询从未影响性能,因为这些查询使用主键进行选择(主要是id)。
我建议您评估taking down query time of a 2-3 millisecond query down to 1 millisecond
与managing and maintaining an extra mid-layer cache service
。
现在,如果要实现中间缓存层以最大程度地减少来自MySQL的负载,则可以使用laravel cache
的本机选项,它们可以永久或在一定时间段内保存/缓存您的集合。如果您想要更强大的功能,则可以尝试使用elasticsearch
或redis
。
我仍然要强调这样一个事实,添加中间层缓存层是一项体系结构更改,将伴随维护时间和数据同步开销。如果要在Laravel之外使用任何服务,请确保具有可靠的后备机制,以便在服务关闭时可以直接从MySQL加载数据。