php范围查询,查询范围 · ThinkPHP6.0完全开发手册 · 看云

本文介绍了如何在ThinkPHP框架中通过定义查询范围(scope)来优化模型查询,包括如何定义、组合及传递参数给查询范围方法。同时,还讲解了如何设置全局查询范围以及如何动态关闭全局查询范围,提升查询效率和代码可读性。
摘要由CSDN通过智能技术生成

可以对模型的查询和写入操作进行封装,例如:

~~~php

namespace app\model;

use think\Model;

class User extends Model

{

public function scopeThinkphp($query)

{

$query->where('name','thinkphp')->field('id,name');

}

public function scopeAge($query)

{

$query->where('age','>',20)->limit(10);

}

}

~~~

就可以进行下面的条件查询:

~~~

// 查找name为thinkphp的用户

User::scope('thinkphp')->find();

// 查找年龄大于20的10个用户

User::scope('age')->select();

// 查找name为thinkphp的用户并且年龄大于20的10个用户

User::scope('thinkphp,age')->select();

~~~

查询范围的方法可以定义额外的参数,例如User模型类定义如下:

~~~

namespace app\model;

use think\Model;

class User extends Model

{

public function scopeEmail($query, $email)

{

$query->where('email', 'like', '%' . $email . '%');

}

public function scopeScore($query, $score)

{

$query->where('score', '>', $score);

}

}

~~~

在查询的时候可以如下使用:

~~~

// 查询email包含thinkphp和分数大于80的用户

User::email('thinkphp')->score(80)->select();

~~~

可以直接使用闭包函数进行查询,例如:

~~~

User::scope(function($query){

$query->where('age','>',20)->limit(10);

})->select();

~~~

>[danger] 使用查询范围后,只能使用`find`或者`select`查询。

## 全局查询范围

支持在模型里面设置`globalScope`属性,定义全局的查询范围

~~~

namespace app\model;

use think\Model;

class User extends Model

{

// 定义全局的查询范围

protected $globalScope = ['status'];

public function scopeStatus($query)

{

$query->where('status',1);

}

}

~~~

然后,执行下面的代码:

~~~

$user = User::find(1);

~~~

最终的查询条件会是

~~~

status = 1 AND id = 1

~~~

如果需要动态关闭所有的全局查询范围,可以使用:

~~~

// 关闭全局查询范围

User::withoutGlobalScope()->select();

~~~

可以使用`withoutGlobalScope`方法动态关闭部分全局查询范围。

```

User::withoutGlobalScope(['status'])->select();

```

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值