2017-02-05 7 views
1

Я использую несколько доменов для одной и той же структуры сайта, поэтому почти все таблицы имеют столбец domain_id. Таким образом, чтобы не определяет Domain_ID условию каждый раз, когда я использую следующий подход (не уверен, если это лучший один)Laravel 5.3 - запросы схемы кэширования информации

я создал BaseModel, что и другие модели, простирающиеся от и иметь это в boot методе этого BaseModel

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

и вот применить содержание метода, согласно документации

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 внутренним кешем этого запроса? Я думаю, возможно, потому что debug включен, поэтому каждый раз, когда он делает запрос? но не могу найти подтверждение этого

q2), и если он не кэшируется, могу ли я его кешировать вручную. Я проверил Laravel документы для добавления кэша, но проблема здесь, что запрос не сделано мной, так что я не могу понять, просто использовать Cache::remember

Благодаря

ответ

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); 
} 
+0

большое спасибо, путь кеширования работал. Интересно, почему это не встроенная функция? – dav

Смежные вопросы