Yii2 Scope 功能的改进 [ 2.0 版本 ]
前段时间发表了一篇文章 面向对象的一小步:添加 ActiveRecord 的 Scope 功能 提到一种更加友好的方式做数据库查询。经小伙伴的建议,在满足同样条件下,可以有更为简洁的封装方法。
这需要用到重载ActiveQuery方法,在通过gii建数据模型model时,可以勾选"Generate ActiveQuery"这么一项自动生成。
例如,在生成Student Model时,可以自动生成StudentQuery
class StudentsQuery extends \yii\db\ActiveQuery
{
/**
* {@inheritdoc}
*
* @return TbStudents[]|array
*/
public function all($db = null)
{
return parent::all($db);
}
/**
* {@inheritdoc}
*
* @return TbStudents|array|null
*/
public function one($db = null)
{
return parent::one($db);
}
//默认筛选已经审核通过的记录,当然,也可以自己定义$status
public function checked($status = 1)
{
return $this->where(['check_status' => $status]);
}
}
checked()方法里面有一条where条件,也可以添加多条。总之,这个checked方法可以随你定义, 封装一类现实应用常用的条件组合。
这样,我们便可以这样来查询:
Student::find()->checked()->where(...)->all();
那又如何满足checked方法的静态调用呢?
Student::checked()->where(...)->all();
这还得在Model里面重载 __callStatic()
方法。这个重载可写在一个如BaseModel的公共方法里面,以便大家调用。
public static function __callStatic($name, $arguments)
{
return static::find()->$name(...$arguments);
}
也更为简洁,同时也是一种透明操作。在StudentQuery中没有定义对应方法或者传参错误都会导致报错。
那么这是如何做到的?
因为在Student里面有这么一段:
public static function find()
{
return new StudentQuery(get_called_class());
}
可见在 __callStatic
中返回的 static::find()
其实就是一个StudentQuery的一个实例,然后在这个实例中去寻找checked方法。绕了个小圈子,重新回到了StudentQuery。道理非常简单。
现在我们同样可以实现两种友好的查询了:
Student::find()->checked()->where(...)->all();
Student::checked(2)->where(...)->all()
对代码简洁性和透明性的要求比较高的小伙伴,可以采用这种封装。
米粒人生 苏州
注册时间:2016-11-07
最后登录:2021-04-25
在线时长:47小时54分
最后登录:2021-04-25
在线时长:47小时54分
- 粉丝109
- 金钱6555
- 威望230
- 积分9325
热门源码
- 店滴云1.3.0
- leadshop - 基于 Yii2 开发的一款免费开源且支持商业使用的商城管理系统
- yii-var-dumper - 将 symfony 的 dump server 适配到 Yii中
- 我用 Yii2 + vue 写了一个博客网站
- 基于 Yii 2 + Bootstrap 3 搭建一套后台管理系统 CMF
- Funboot——基于Yii2的Saas快速开发平台
- 店滴AI-基于AI技术的开源软硬件开发
- yii2-swoole,让yii2运行在swoole上。响应速度比php-fpm提升5倍以上
- 基于 Yii2 开发的多店铺商城系统,免费开源 + 适合二开
- 开单大师(首家100%开源可定制的房产中介ERP管理系统) 源码销售
共 3 条评论
顶
报错Invalid argument supplied for foreach
这个和laravel 的scope查询作用域的想法差不多 但是感觉自己在模型定义一个查询方法是差不多