网站

thinkphp5 查询范围scope方法的使用

分类 :thinkphp5     2019-04-17 人气:0 0条评论

当我们写程序时,经常会写一些相同的查询语句,而查询范围这个功能就是为了解决这个问题,让我们将重复查询的语句放在同一个模型中,进行调用即可。
命名规则:scope+查询范围名称

单查询

在模型中定义

我们定义了一个Sex字段,里面的where是查询语句
protected function scopeSex($query)
	{
		$query->where('sex','1');
	}

在方法页面中使用

使用时,用scope('查询范围名称'),程序遇到scope会将其和括号中的查询范围名称拼接,然后调用我们在模型中定义的方法
后面可以拼接上一些其它的查询条件
$list = Tp::scope('sex')->select();
上面运行后的原生语句是
SELECT * FROM `dede_tp` WHERE `sex` = '1'

多查询

如果我们有scopeSexscopeName,我们在方面使用时,可以直接将两个同时调用
模型中定义
protected function scopeSex($query)
	{
		$query->where('sex','1');
	}
	
	protected function scopeName($query)
	{
		$query->where('name','TPs');
	}
方法中调用
$list = Tp::scope('sex,name')->select();

传参的方式

上面是固定内容查询的方式,我们大多数时候需要专参查询

内容模型

$a是传入的参数
protected function scopeSex($query,$a)
	{
		$query->where('sex',$a);
	}
方法使用中传参时采用的这种方式:0是我们传的参数,sex当然是字段名了
$list = Tp::scope('sex','0')->select();

动态多条查询

看视频中还用的是scope('sex')->scope('name')这种链式方法,可不知为何我使用不起作用
模型中的定义不断,依然是scopeSexscopeName

方法中使用

sex()name()便是我们模型中定义的查询范围,下面的使用中,sex使用了传值name使用了默认值
$tp = new Tp;
$list = $tp->sex('1')->name()->select();

闭包函数查询

即直接在页面方法中使用查询,不用在模型中定义
$list = Tp::scope(function($query){
			$query->order('id','desc')->select();
		});
运行后的原生语句是
SELECT * FROM `dede_tp` ORDER BY `id` DESC

全局查询范围

全局查询范围方法在5.0.2版本之前必须定义为static静态方法。

如果你的所有查询都需要一个基础的查询范围,那么可以在模型类里面定义一个静态的base方法,定义后,前台页面中不需要调用这个全局查询方法,会自动追加到里面

模型文件中

protected static function base($query)
	{
		$query->where('id',1);
	}
我们使用后,前台方中不用添加任何语句,依然运行上方的闭句函数查询语句
运行后的原生语句已将我们的全局查询内容添加上了
SELECT * FROM `dede_tp` WHERE `id` = 1 ORDER BY `id` DESC

评论

大侠名号:   验证暗号: 点击我更换图片

继续阅读