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

原文地址:https://www.cnblogs.com/muwu/p/9038526.html

时间: 2024-10-10 09:44:44

laravel 本地作用于 模型查询的相关文章

ThinkPHP5——模型查询返回的对象转换为数组

使用模型查询的返回的结果集为对象,其中里面的数据,TP5框架会自动对里面的data:protected该项进行处理. 但有时我们就想要数据,就想返回一个数组就可以了,怎么办?有两种方法可以实现: 方法一:找到TP5框架中的database.php文件,该文件中找到 resultset_type 该项,将后面的 array 改成 \think\Collection [注意大小写] // 数据集返回类型 'resultset_type' => 'array',  改为 // 数据集返回类型 'res

laravel中关联模型查询选择性的字段

在使用 Laravel 的关联查询中,我们经常使用 with 方法来避免 1+N 查询,但是 with 会将目标关联的所有字段全部查询出来,对于有强迫症的PHPer来说,当然是不允许发生的. 第一种方法:在模型里就写好,固定死 方便简洁,但是不能针对不同的需求去关联不同的字段,一旦在模型关联中写死,所有的关联的字段都是一样的 在user模型里,写关联函数,一对多.此模型放在APP\Models下,默认放在App下 1 public function hasPost(){ 2 return $th

Laravel5.1 模型--查询

前两天病了..一直没写笔记,今儿个来看看Model在实际开发中的一些简单使用,首先 我们来为今天的学习做个铺垫,也当做复习了 准备工作 1.生成表 php artisan make:migration create_articles_table --create=articles <?php use Illuminate\Database\Schema\Blueprint; use Illuminate\Database\Migrations\Migration; class CreateArt

laravel框架之ORM模型

ORM模型简介 1>什么是ORM? ORM,即 Object-Relational Mapping(对象关系映射),它的作用是在关系型数据库和业务实体对象之间作一个映射,这样,我们在操作具体的 业务对象时,就不需要再去和复杂的SQL语句打交道,只需简单的操作对象的属性和方法即可. 2>ORM 两种最常见的实现方式是 ActiveRecord 和 DataMapper, ActiveRecord(非常流行) 中模型与数据表一一对应, DataMapper 中模型与数据表是完全分离的. 3>

Laravel5.1 模型--查询作用域

所谓的查询作用域就是允许你自定义一个查询语句 把它封装成一个方法. 1 定义一个查询作用域 定义查询作用域就是在模型中声明一个scope开头的方法: public function scopeHotArticle($query) { return $query->orderBy('comment_count','desc')->first(); } 然后可以这样使用: public function getIndex() { $hot = Article::hotArticle(); dd($

搜索引擎的检索模型-查询与文档的相关度计算

1. 检索模型概述 搜索结果排序时搜索引擎最核心的部分,很大程度度上决定了搜索引擎的质量好坏及用户满意度.实际搜索结果排序的因子有很多,但最主要的两个因素是用户查询和网页内容的相关度,以及网页链接情况.这里我们主要总结网页内容和用户查询相关的内容. 判断网页内容是否与用户査询相关,这依赖于搜索引擎所来用的检索模型.检索模型是搜索引擎的理论基础,为量化相关性提供了一种数学模型,是对查询词和文档之间进行相似度计算的框架和方法.其本质就是相关度建模.如图所示,检索模型所在搜索引擎系统架构位置: 当然检

ThinkPHP5.0 模型查询操作

1.获取单个数据 //取出主键为1的数据 $user = User::get(1); echo $user->name; // 使用数组查询 $user = User::get(['name' => 'thinkphp']); // 使用闭包查询 $user = User::get(function($query){ $query->where('name', 'thinkphp'); }); echo $user->name; //实例化模型后调用查询 $user = new U

DefaultView 的作用(对DataSet查询出的来数据进行排序)

DefaultView 的作用 收藏    一直以来在对数据进行排序, 条件查询都是直接重复构建SQL来进行, 在查询次数和数据量不多的情况下倒没觉得什么, 但慢慢得, 当程序需要对大量数据椐不同条件进行多次查廛或排序时, 使用这种方式显然对程序的性能影响将会是十分明显的, 在网上找了一下, 发现DATAVIEW能很好的解决这个问题, 其提供了一种简单直观的方式来操作数据, 如下面代码: SqlConnection conn = new SqlConnection("server=.;datab

django基础知识之模型查询:

查询集表示从数据库中获取的对象集合 查询集可以含有零个.一个或多个过滤器 过滤器基于所给的参数限制查询的结果 从Sql的角度,查询集和select语句等价,过滤器像where和limit子句 接下来主要讨论如下知识点 查询集 字段查询:比较运算符,F对象,Q对象 查询集 在管理器上调用过滤器方法会返回查询集 查询集经过过滤器筛选后返回新的查询集,因此可以写成链式过滤 惰性执行:创建查询集不会带来任何数据库的访问,直到调用数据时,才会访问数据库 何时对查询集求值:迭代,序列化,与if合用 返回查询