这是我的UserController@getIndex,它输出一些用户和所有用户计数。
$name = Input::get('name');
$page = Input::get('page');
$limit = Input::get('limit');
$users = User::where('name', 'like', '%'.$name.'%')
->orderBy('created_at', 'desc')
->skip($limit*$page)->take($limit)
->get();
return array(
'rows'=>$users->toArray(),
'results'=>User::where('name', 'like', '%'.$name.'%')->count(),
);
是否有任何方法我可以重用'where()'部分,所以我不必重复我自己?
您可以使用查询范围来避免重复:
//app/models/User.php
public function scopeFilterName($query, $name) {
return $query->where('name', 'like', '%'.$name.'%');
}
///////////////////////////
//in the controller
$name = Input::get('name');
$page = Input::get('page');
$limit = Input::get('limit');
$users = User::filterName($name)
->orderBy('created_at', 'desc')
->skip($limit*$page)->take($limit)
->get();
return array(
'rows'=>$users->toArray(),
'results'=>User::filterName($name)->count(),
);
不是很方便的方法,但它可以让您了解Builder是如何工作的:
$query = User::where('name', 'like', "%{$name}%");
$anotherQuery = clone $query;
$query->orderBy('created_at', 'desc') // you can use latest() method for this btw
->skip( 5 ) // sets OFFSET 5
->take( 10 ) // sets LIMIT 10
->get();
现在,这些子句仍然在构建器上,所以这将返回null:
$query->count();
因为OFFSET 5
所以你可以用:
$anotherQuery->count();
或:
$query->skip(0)->take(9999);
或者更不方便的:
$query->getQuery() // get the base Query Builder object
->limit = null;
$query->getQuery()->offset = null;
还有一个注意-我不同意这里不适合scope
,事实上我会使用它