Laravel Eloquent缓存查询条件

时间:2014-06-17 10:47:13

标签: php laravel eloquent

这是我的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()'部分所以我不必重复自我?

2 个答案:

答案 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不适合这里,我会实际使用它。