zoukankan      html  css  js  c++  java
  • 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  AppTopic;

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

     

     

  • 相关阅读:
    试试中文时间
    一道极限题目,难道不识别align*环境?
    一道求三元函数在空间区域上平均值的题目
    一道用单调有界证明的数列极限题目
    ORA-00119和ORA-00132报错
    安装mysql时提示This application requires .NET framework 4.5.2的解决办法
    Linux防火墙的开启关闭
    ORA-12541:TNS:无监听程序问题 解决办法
    卸载oracle11g
    Linux笔记
  • 原文地址:https://www.cnblogs.com/muwu/p/9038526.html
Copyright © 2011-2022 走看看