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 可以取到这个值,把值传入作用域方法就可以得到对应的结果。

 

 

 

 

 

posted @ 2018-05-14 22:29  沐屋  阅读(256)  评论(0编辑  收藏  举报