2015-02-09 17 views
5

憑藉雄辯的模型添加範圍很簡單:Laravel 4:如何將範圍添加到DB :: table?

public function scopeMyScope($query) 
{ 
    // Do stuff to that $query 
} 

但如何添加範圍DB::table

我使用這個查詢來獲取頁面訪問量:

$views = DB::table('page_views') 
    ->where('id', $this->id) 
    ->where('agent', 'NOT LIKE', '%bot%') 
    ->count(DB::raw('distinct session, DATE(created_at)')); 

我還展示了最熱門的網頁等與其他的查詢,但具有相同的where條件。所以我只想定義一次我的where條件,並在所有其他頁面視圖DB::table查詢中重複使用它們。

回答

10

DB::table不支持範圍。你可以做的只是編寫一個小函數,在查詢中執行一些操作並返回它。語法是不是很好,但它的工作原理:

function applyScope($query){ 
    $query->whereNotNull('deleted_at'); 
    $query->where('foo', 'bar'); 
    return $query; 
} 

然後:

$query = DB::table('page_views') 
    ->where('id', $this->id) 
    ->where('agent', 'NOT LIKE', '%bot%'); 
$query = applyScope($query); 
$views = $query->count(DB::raw('distinct session, DATE(created_at)')); 

還是有點短語法:

$views = applyScope(DB::table('page_views') 
         ->where('id', $this->id) 
         ->where('agent', 'NOT LIKE', '%bot%') 
     )->count(DB::raw('distinct session, DATE(created_at)')); 
+0

好的提示,這給了我創建一個'PageViewQueryBuilder'類的想法,它擴展了'DB'並且有它自己的'table'函數:'$ que ry = parent :: table('page_views') - > where('user',null)'等等,等等。 – 2015-02-09 23:36:23

+1

太棒了!讓我知道如果你需要任何幫助:) – lukasgeiter 2015-02-09 23:41:10

+0

我實現了這個[解決方案](http://stackoverflow.com/a/28429629/3903565)。感謝給我的想法:) – 2015-02-10 10:44:29

7

感謝lukasgeiter answer我的想法爲此創建一個類,它擴展了DB並返回可以建立的查詢的開始:

class PageViewQueryBuilder extends DB { 

    public static function table() 
    { 
     $query = parent::table('page_views') 
      ->where('agent', 'NOT LIKE', '%bot%') 
      ->where('agent', 'NOT LIKE', '%spider%') 
      ->where('agent', 'NOT LIKE', '%crawler%') 
      ; 

     return $query; 
    } 
} 

我現在可以用這個來創建一些不同的查詢,所有的條件都一樣。

特定頁面獲取查看次數:

$count = PageViewQueryBuilder::table() 
    ->where('page_id', $id) 
    ->count(DB::raw('distinct session, DATE(created_at)')); 

獲取特定頁面的所有訪問量:

$views = PageViewQueryBuilder::table() 
    ->where('page_id', $id) 
    ->orderBy('created_at', 'DESC') 
    ->groupBy('session', DB::raw('DATE(created_at)')) 
    ->get(); 

獲得10個最熱門的網頁在過去三個月:

$views = PageViewQueryBuilder::table() 
    ->selectRaw('page_id as page_id, count(distinct session, DATE(created_at)) as page_views') 
    ->whereRaw('created_at BETWEEN NOW() - INTERVAL 3 MONTH AND NOW()') 
    ->groupBy('page_id') 
    ->orderBy('page_views', 'desc') 
    ->limit(10) 
    ->get();