Yii上的FindAll,无效的字段名称

时间:2016-03-21 03:36:35

标签: php mysql yii

我正在使用YII 1.1并尝试在3个表之间创建关系。

到目前为止一切都那么好,但是当我尝试在findAll中做一个clausule时,所有东西都会变得很奇怪。

我的模型叫做课程,它有很多模块,里面有很多视频。 在查找所有我想缩小到仅激活的课程,模块和视频。

为此,我使用以下代码:

        $courses=Course::model()->with(array(
        'module' => array('joinType'=>'INNER JOIN', 'together'=>true),
        'module.video' => array('joinType'=>'INNER JOIN', 'together'=>true),
    ))->findAll("language_id=2 && ==> **course.activated=1** <== && module.activated=1 && video.activated=1");

问题是,生成的sql语句告诉我激活的列不存在。

CDbCommand failed to execute the SQL statement: SQLSTATE[42S22]: Column not found: 1054 Unknown column 'course.activated' in 'where clause'. The SQL statement executed was: SELECT `t`.`id` AS `t0_c0`, `t`.`name` AS `t0_c1`, `t`.`description` AS `t0_c2`, `t`.`language_id` AS `t0_c3`, `t`.`activated` AS `t0_c4`, `module`.`id` AS `t1_c0`, `module`.`course_id` AS `t1_c1`, `module`.`name` AS `t1_c2`, `module`.`description` AS `t1_c3`, `module`.`activated` AS `t1_c4`, `video`.`id` AS `t2_c0`, `video`.`module_id` AS `t2_c1`, `video`.`name` AS `t2_c2`, `video`.`description` AS `t2_c3`, `video`.`video_url` AS `t2_c4`, `video`.`position` AS `t2_c5`, `video`.`activated` AS `t2_c6` FROM `Course` `t` INNER JOIN `Module` `module` ON (`module`.`course_id`=`t`.`id`) INNER JOIN `Video` `video` ON (`video`.`module_id`=`module`.`id`) WHERE (language_id=2 && course.activated=1 && module.activated=1 && video.activated=1)

但是,正如我在代码中看到的那样,Yii为课程创建了一个别名,别名是&#34; t&#34;。

如果我更改了findAll并使用t.activated而不是course.activated它就像一个魅力。 但是,感觉不对,我怎样才能使用课程而不是&#34; t&#34; yii在查询中使用的别名? 如果我删除t。当然mysql告诉我激活是不明确的

2 个答案:

答案 0 :(得分:2)

默认情况下,Yii使用&#34; t&#34;将SQL查询中的主表别名,但它并不意味着您必须坚持使用它。您可以通过设置&#34;别名&#34;来更改它。 CDbCriteria的财产

$courses = Course::model()->with(array(
        'module' => array('joinType'=>'INNER JOIN', 'together'=>true),
        'module.video' => array('joinType'=>'INNER JOIN', 'together'=>true),
    ))->findAll(array('condition' => "language_id=2 && ==> **course.activated=1** <== && module.activated=1 && video.activated=1", 'alias' => 'course'));

condition参数接受CDbCriteria对象,类似于数组的CDbCriteria属性或字符串。

http://www.yiiframework.com/doc/api/1.1/CDbCriteria#alias-detail

http://www.yiiframework.com/doc/api/1.1/CActiveRecord#findAll-detail

答案 1 :(得分:0)

感谢SiZE,我在yii上找到了以下文字:

在关系AR查询中,主表的别名固定为t,而关系表的别名默认与对应的关系名相同。

因此,正如SiZE所说,t始终是主表的别名。