2016-03-21 4 views
0

私はYII 1.1を使用しており、3つのテーブル間の関係を作成しようとしています。YiiのFindAll、無効なフィールド名

これまでのところとても良いですが、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はコースにエイリアスを作成し、エイリアスは「T」です。

私がfindAllを変更し、course.activatedの代わりにt.activatedを使用すると、それは魅力的に機能します。 しかし、それは正しいとは思いません.yiiがクエリで使用した "t"エイリアスの代わりに、どのようにしてコースを使うことができますか? 私はトンを削除する場合は、もちろんMySQLが起動し、私はYiiの上で次のテキスト見つかっサイズに

+1

それはYiiのための大会ですので、あなたがメインのActiveRecordモデル – SiZE

+0

おお用Tの別名を使用する必要があり、私は、ということを知っていたしませんでしたか? – Lefsler

答えて

0

おかげで曖昧であることを私に伝えます:主のためのリレーショナルARクエリで

、エイリアス名をテーブルはtとして固定され、リレーショナルテーブルのエイリアス名はデフォルトで対応するリレーション名と同じです。

SiZEによれば、tは常にプライマリテーブルのエイリアスです。

2

デフォルトでは、YiiエイリアスはSQLクエリのプライマリテーブルに "t"を付けますが、それに固執する必要はありません。あなたは条件パラメータがCDbCriteriaオブジェクト、配列のようなCDbCriteriaのプロパティまたは文字列を受け取り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')); 

の「エイリアス」プロパティを設定することによって、それを変更することができます。

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

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

+0

それは私のために働いていませんでした。 – Lefsler

関連する問題