阿江 2017-10-01 16:12:03 2833次浏览 0条回复 0 0 0

说明

学习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。

(全文完)

    没有找到数据。
您需要登录后才可以回复。登录 | 立即注册