laravel 本地作用于 模型查询
如果我们要再多个控制器中通过模型中查询相同的条件时候,可以再模型中使用本地作用域来达到重复使用。
举个例子:以帖子为例...我要以创建时间排序,和更新时间排序,去显示。
再模型中我们可以这样做:
class Topic
{
// 按更新时间排序的帖子
public function scopeRecent( $query )
{
return $query->orderBy( ' updated_at ' , ' desc ' ) ;
}
//按创建时间排序的帖子
public function scopeCreateTime( $query )
{
return $query->order( ' created_at ' , ' desc ' ) ;
}
}
你会发现两个方法都有scope,是因为:本地作用域能定义通用的约束集合以便在应用中复用,只需要在 scope 前加上一个 Eloquent 模型方法即可。作用域应始终返回查询生成器实例,再我们使用本地作用域的时候,去掉scope 即可。比如:
在控制器中:
use App\Topic;
class Topic extends Controller
{
public function index( Topic $topic)
{
$topics = $topic->Recent()->paginate( 5 ) ;
}
}
可以从例子中看出来,我们使用本地作用于方法不需要带上 scope 即可。这个例子的意思为:从 topic 模型中按更新时间去排序后进行分页。
只要我们在Topic模型去以更新时间排序查询的时候,在任何控制器中可以直接调用:Recent 方法,避免在控制器中写上很多链式查询条件。
我们可以优化以下以上的代码:
创建一个本地作用域集合查询的方法,接收一个查询参数:
public function scopeSetSelect( $query , $param )
{
switch( $param )
{
case 值1 :
return $query->recent() ;
break ;
case 值2 :
return $query->createtime();
break ;
}
}
我们可以看到,这个方法接收一个参数 $param 跟据它不同的值来调用不同的生成构造器,我们在控制器中看看使用方法:
public function index ( Request $request , Topic $topic)
{
$topics = $topic->setSelect( 值1 )->paginate( 5 ) ;
}
在这里可以看出,我们调用这个作用域方法,传入一个值1,这样子,我们实际调用的就是 recent 这个本地作用域方法,我们从模板传递过来值,给集合查询的方法。
在模板中,我们通过 get 形式传参,举例:<a href=" {{ Request::url() }} ?status=值1 ">最新帖子</a> 在这个例子中,Request::url() 获取的是当前的 url。
给当前的 url 带上参数值1,通过路由传递参数到控制器,在控制器中通过 $request->status 可以取到这个值,把值传入作用域方法就可以得到对应的结果。