Laravel 4: How to add scope to DB::table?

后端 未结 4 1954
北荒
北荒 2021-01-12 18:38

With Eloquent models adding scopes is easy:

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

But how to add scope to

4条回答
  •  温柔的废话
    2021-01-12 19:09

    Thanks to lukasgeiter answer I got the idea of creating a class for this, that extends DB and returns the beginning of a query that can be built upon:

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

    I can now use this to create a number of different queries, all with the same where conditions.

    Get view count for a specific page:

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

    Get all views for a specific page:

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

    Get the 10 most popular pages for the last three months:

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

提交回复
热议问题