自定义ActiveQuery类

默认情况下,所有的Active Record查询是由\yii\db\ActiveQuery支持的。为了在一个Active Record中使用一个自定义的查询类,你可以重写\yii\db\ActiveRecord::find()方法,并返回一个你的自定义查询类的实例。

准备

  1. 按照官方指南http://www.yiiframework.com/doc-2.0/guide-start-installation.html的描述,使用Composer包管理器创建一个新的应用。
  2. 设置数据库连接,创建一个名为post的表:
  1. DROP TABLE IF EXISTS ''post'';
  2. CREATE TABLE IF NOT EXISTS ''post'' (
  3. ''id'' INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  4. ''lang'' VARCHAR(5) NOT NULL DEFAULT ''en'',
  5. ''title'' VARCHAR(255) NOT NULL,
  6. ''text'' TEXT NOT NULL,
  7. PRIMARY KEY (''id'')
  8. );
  9. INSERT INTO ''post''(''id'',''lang'',''title'',''text'')
  10. VALUES (1,''en_us'',''Yii news'',''Text in English''),
  11. (2,''de'',''Yii Nachrichten'',''Text in Deutsch'');
  1. 使用Gii生成一个Post模型,并选中Generate ActiveQuery选项,这会生成PostQuery类。

如何做…

  1. models/PostQuery.php添加如下方法:
  1. <?php
  2. namespace app\models;
  3. /**
  4. * This is the ActiveQuery class for [[Post]].
  5. *
  6. * @see Post
  7. */
  8. class PostQuery extends \yii\db\ActiveQuery
  9. {
  10. /**
  11. * @param $lang
  12. *
  13. * @return $this
  14. */
  15. public function lang($lang)
  16. {
  17. return $this->where([ 'lang' => $lang ]);
  18. }
  19. }
  1. 现在,我们可以使用我们的模型。创建controllers/DbController.php
  1. <?php
  2. namespace app\controllers;
  3. use app\models\Post;
  4. use yii\helpers\Html;
  5. use yii\web\Controller;
  6. /**
  7. * Class DbController.
  8. * @package app\controllers
  9. */
  10. class DbController extends Controller
  11. {
  12. public function actionIndex()
  13. {
  14. // Get posts written in default application language
  15. $posts = Post::find()->all();
  16. echo Html::tag('h1', 'Default language');
  17. foreach ($posts as $post) {
  18. echo Html::tag('h2', $post->title);
  19. echo $post->text;
  20. }
  21. // Get posts written in German
  22. $posts = Post::find()->lang('de')->all();
  23. echo Html::tag('h1', 'German');
  24. foreach ($posts as $post) {
  25. echo Html::tag('h2', $post->title);
  26. echo $post->text;
  27. }
  28. }
  29. }
  1. 现在运行db/index你会得到类似如下截图所示的输出:

自定义ActiveQuery类 - 图1

工作原理…

我们在Post模型中重写了find方法,并扩展了ActiveQuery类。lang方法返回指定语言值的ActiveQuery。为了支持链式调用,lang返回自身模型的实例。

参考

欲了解更多信息,参考如下地址: