2015-02-09 12 views
5

Với mô hình hùng biện thêm phạm vi rất dễ dàng:Laravel 4: Cách thêm phạm vi vào bảng DB ::?

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

Nhưng làm thế nào để thêm phạm vi để DB::table?

tôi sử dụng truy vấn này để có được lượt xem:

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

Tôi cũng hiển thị các trang phổ biến nhất vv với các truy vấn khác, nhưng với sự where điều kiện tương tự. Vì vậy, tôi muốn chỉ xác định các điều kiện where của mình một lần và sử dụng lại chúng trong tất cả các truy vấn trang DB::table truy vấn khác.

Trả lời

10

DB::table không có hỗ trợ cho phạm vi. Những gì bạn có thể làm chỉ đơn giản là viết một hàm nhỏ làm một số việc với truy vấn và trả về nó. Cú pháp không phải là đẹp, nhưng nó hoạt động:

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

Và sau đó:

$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)')); 

Hoặc một chút một cú pháp ngắn:

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

Mẹo hay, điều này đã cho tôi ý tưởng tạo một lớp 'PageViewQueryBuilder' mở rộng' DB' và có hàm 'table' riêng của nó:' $ que ry = parent :: table ('page_views') -> where ('user', null) 'etc, v.v. Thử nghiệm với nó ngay bây giờ. –

+1

Tuyệt vời! Hãy cho tôi biết nếu bạn cần bất kỳ sự trợ giúp nào :) – lukasgeiter

+0

Tôi đã triển khai [giải pháp] này (http://stackoverflow.com/a/28429629/3903565). Cảm ơn đã cho tôi ý tưởng :) –

7

Nhờ lukasgeiter answer tôi đã có ý tưởng tạo một lớp học cho điều này, mở rộng DB và trả về phần đầu của truy vấn có thể được xây dựng theo:

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

Tôi hiện có thể sử dụng tính năng này để tạo một số truy vấn khác nhau, tất cả đều có cùng điều kiện.

Nhận số lượt xem cho một trang cụ thể:

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

Nhận tất cả các quan điểm cho một trang cụ thể:

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

Lấy 10 trang phổ biến nhất trong ba tháng qua:

$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(); 
Các vấn đề liên quan