2017-02-05 57 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