2017-02-05 13 views
1

同じサイト構造に対して複数のドメインを使用しているため、ほぼすべてのテーブルにdomain_idという列があります。だから、私は次のようなアプローチ(これは最良のものであるかどうかわからない)Laravel 5.3 - キャッシング情報スキーマクエリ

を使用していますたびに、私は他のモデルはから延び、そのBaseModel

boot方法でこれを持っていること BaseModelを作成しdomain_idに条件を定義しないようにここ
parent::boot(); 
static::addGlobalScope(new DomainScope()); 

とは、私が例えばを持っているがあれば、これは素晴らしい作品

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

ドキュメントに記載の方法の内容を適用しています5発見は、私は、私は完全にそれをするかどうかをチェックするために理解し、今、この

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

よう5クエリを参照デバッグパネルの(単なる例として)同じテーブルに、同じページ上を問い合わせます列はテーブルに存在し、情報スキーマから情報を取得しますが、なぜ同じテーブルに対して同じクエリを何度も繰り返し実行しています。私はそれが1つの要求をしてからそれをキャッシュし、その後の要求に対してただキャッシュから読み込むべきであると推測します。

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

あなたの場合:あなたは、単にモデルがそうのようなマルチドメインモデル(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