Laravel雄辩缓存查询条件


Laravel Eloquent cache query conditions

这是我的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,事实上我会使用它