2017-02-05 45 views
1

我对同一站点结构使用多个域,因此几乎所有表都有domain_id列。所以,不是每一次定义域ID的条件,我使用的是其他车型从延伸并在BaseModel的boot方法有下面这样的方式(不知道这是最好的一个)Laravel 5.3 - 缓存信息模式查询

我创建BaseModel

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

,这里是根据文档

if (Schema::hasColumn($model->getTable(), 'domain_id')) { 
    $builder->where('domain_id', '=', DOMAIN_ID); 
} 

这个伟大的工程apply方法的内容,但是如果我有如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

嗯,我会建议不要点火查询用于每次检查表中是否存在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); 
} 

如果您:您可以通过简单地添加到您的模型中的变量定义模型是否是一个多领域模型(有一个域ID列)或单域模型(无域ID列)像这样做不想使用上面的,你可以像这样缓存:

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

非常感谢,缓存方式奏效。我想知道为什么这不是一个内置功能 – dav