[Yii2笔记]017 AR自定义查询类(Customizing Query Classes) [ 技术分享 ]
说明
学习Yii Framework 2(易2框架)的过程是漫长的,也是充满乐趣的,以下是我学习Yii2框架时对官网英文资料(请参见原文网址)的翻译和代码实现,提供了较完整的代码,供你参考。不妥之处,请多多指正!
原文网址:
http://www.yiiframework.com/doc-2.0/guide-db-active-record.html#customizing-query-classes
13、Customizing Query Classes(自定义查询类)
本文主题:AR自定义查询类(Customizing Query Classes)
13、自定义查询类(Customizing Query Classes) 默认的,所有的Active Record都是由yii\db\ActiveQuery支持的,要在Active Record类中使用自定义的查询类,你可以重写yii\db\ActiveRecord::find()方法并返回一个你自定义查询类的实例,例如:
// file Comment.php
namespace app\models;
use yii\db\ActiveRecord;
class Comment extends ActiveRecord{
public static function find(){
return new CommentQuery(get_called_class());
}
}
现在你使用Comment无论是执行一个查询(如find()、findOne()),还是定义一个关联(如hasOne()),你都将调用CommentQuery实例,而不是ActiveQuery。
你现在需要去定义CommentQuery类,它通过多种创新的定制方式提升了你的查询构建经验,例如:
// file CommentQuery.php
namespace app\models;
use yii\db\ActiveQuery;
class CommentQuery extends ActiveQuery
{
// conditions appended by default (can be skipped)
public function init()
{
$this->andOnCondition(['deleted' => false]);
parent::init();
}
// ... add customized query methods here ...
public function active($state = true)
{
return $this->andOnCondition(['active' => $state]);
}
}
注意:当定义新的查询构建方法时,通常你不是调用onCondition()方法,而是调用andOnCondition()或orOnCondition去追加额外的查询条件,这样之前定义的查询条件将不会被覆盖掉。
这样你就可以编写如下的查询构建代码了:
$comments = Comment::find()->active()->all();
$inactiveComments = Comment::find()->active(false)->all();
小贴士:在大型项目中,推荐你使用自定义查询类,这样大多数的查询相关代码可以被封装起来,而使用得Active Record类显得更加简洁。
当定义Comment的关联或执行关联查询时,你可以使用新的查询构建方法:
class Customer extends \yii\db\ActiveRecord
{
public function getActiveComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id'])->active();
}
}
$customers = Customer::find()->joinWith('activeComments')->all();
// or alternatively
class Customer extends \yii\db\ActiveRecord
{
public function getComments()
{
return $this->hasMany(Comment::className(), ['customer_id' => 'id']);
}
}
$customers = Customer::find()->joinWith([
'comments' => function($q) {
$q->active();
}
])->all();
信息:在Yii 1.1版本,有一个概念叫作Scope,Scope在Yii 2.0中不再直接支持,你可以自定义查询类和查询方法实现Scope。
(全文完)
共 0 条回复
没有找到数据。
阿江
注册时间:2015-10-18
最后登录:2024-03-03
在线时长:186小时21分
最后登录:2024-03-03
在线时长:186小时21分
- 粉丝94
- 金钱16816
- 威望160
- 积分20276