Tho*_*sen 6 php laravel laravel-4
使用Eloquent模型可以轻松添加范围:
public function scopeMyScope($query)
{
// Do stuff to that $query
}
Run Code Online (Sandbox Code Playgroud)
但是如何添加范围DB::table呢?
我使用此查询来获取页面视图:
$views = DB::table('page_views')
->where('id', $this->id)
->where('agent', 'NOT LIKE', '%bot%')
->count(DB::raw('distinct session, DATE(created_at)'));
Run Code Online (Sandbox Code Playgroud)
我还用其他查询显示最受欢迎的页面等,但具有相同的 where条件.所以我想只定义where一次条件并在所有其他页面查看DB::table查询中重用它们.
luk*_*ter 13
DB::table不支持范围.你可以做的只是编写一个小函数,用查询做一些事情并返回它.语法不是很好,但它的工作原理:
function applyScope($query){
$query->whereNotNull('deleted_at');
$query->where('foo', 'bar');
return $query;
}
Run Code Online (Sandbox Code Playgroud)
然后:
$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)'));
Run Code Online (Sandbox Code Playgroud)
或者更简短的语法:
$views = applyScope( DB::table('page_views')
->where('id', $this->id)
->where('agent', 'NOT LIKE', '%bot%')
)->count(DB::raw('distinct session, DATE(created_at)'));
Run Code Online (Sandbox Code Playgroud)
感谢lukasgeiter的回答,我想到了为此创建一个类,它扩展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;
}
}
Run Code Online (Sandbox Code Playgroud)
我现在可以使用它来创建许多不同的查询,所有查询都具有相同的条件.
获取特定页面的查看次数:
$count = PageViewQueryBuilder::table()
->where('page_id', $id)
->count(DB::raw('distinct session, DATE(created_at)'));
Run Code Online (Sandbox Code Playgroud)
获取特定页面的所有视图:
$views = PageViewQueryBuilder::table()
->where('page_id', $id)
->orderBy('created_at', 'DESC')
->groupBy('session', DB::raw('DATE(created_at)'))
->get();
Run Code Online (Sandbox Code Playgroud)
获取过去三个月中最受欢迎的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();
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2340 次 |
| 最近记录: |