这是我的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()'部分所以我不必重复自我?
答案 0 :(得分:1)
您可以使用query scopes不要重复自己:
//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(),
);
答案 1 :(得分:1)
不太方便,但它会让你了解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
不适合这里,我会实际使用它。