Laravel 5.3 - 缓存信息模式查询

时间:2017-02-05 19:52:43

标签: laravel laravel-5

我对同一网站结构使用多个域,因此几乎所有表都有domain_id列。所以,每次我使用以下方法时都不要定义domain_id条件(不确定这是否是最好的方法)

我创建了BaseModel,其他模型正在扩展,并在该BaseModel的boot方法中具有此功能

parent::boot();
static::addGlobalScope(new DomainScope());

以下是根据文档

的apply方法的内容
if (Schema::hasColumn($model->getTable(), 'domain_id')) {
    $builder->where('domain_id', '=', DOMAIN_ID);
}

这很有效,但是如果我有例如 5查找相同的页面上,同一个表(仅作为示例)在调试面板中我看到 5个查询就像这样

select column_name from information_schema.columns where table_schema = 'my_db_name' and table_name = 'my_table_name'

现在,我完全理解为了检查表中是否存在列,它从信息模式中获取信息,但是为什么它反复对同一个表进行相同的查询。我认为它应该发出一个请求然后缓存它,以及后续请求只是从缓存中读取。

q1) laravel是否在内部缓存此查询?我想也许是因为启用了调试,这就是为什么每次进行查询?但无法找到任何验证

q2)如果它没有缓存,我可以手动缓存它吗?我检查了laravel文档是否添加了缓存,但是这里的查询问题不是由我完成的,所以我不知道只是使用Cache::remember

由于

1 个答案:

答案 0 :(得分:1)

好吧,我建议不要每次都检查表中是否存在domain_id。您可以通过简单地向模型添加一个变量来定义模型,该变量定义模型是多域模型(具有domain_id列)还是单域模型(没有domain_id列),如下所示:

// In BaseModel.php
public $multiDomain = true; // override to false in your child model class if it's a single domain model
// In DomainScope apply method
if ($model->multiDomain)) {
    $builder->where('domain_id', '=', DOMAIN_ID);
}

如果您不想使用上述内容,可以像以下一样进行缓存:

if(Cache::remember($model->getTable() . "_domain", $minutes, function() use($model) {
    return Schema::hasColumn($model->getTable(), 'domain_id');
}) {
    $builder->where('domain_id', '=', DOMAIN_ID);
}