2016-03-21 16 views
0

Ich verwende YII 1.1 und versuche, eine Beziehung zwischen 3 Tabellen zu erstellen.FindAll auf Yii, ungültiger Feldname

So weit so gut, aber wenn ich versuche, ein wo clausule innerhalb der findAll die Sachen bekommen ein bisschen komisch.

Mein Modell heißt Kurs und es hat viele Module, die viele Videos hat. Auf die Suche möchte ich nur die Kurse, Module und Videos eingrenzen, die aktiviert sind.

Dazu verwende ich den folgenden Code:

 $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"); 

Das Problem ist, erzeugt die SQL-Anweisung sagt mir, dass die aktivierte Spalte existiert nicht.

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) 

Aber es tut, wie ich auf dem Code sehen kann, die Yü einen Alias ​​zum Kurs erstellen und die Alias ​​„t“.

Wenn ich die findAll ändern und t.activated anstelle von natürlich verwenden.aktiviert es funktioniert wie ein Charme. Aber es fühlt sich nicht richtig an, wie kann ich Kurs anstelle des "t" Alias ​​verwenden, den das yii für die Abfrage verwendet? Wenn ich das t entfernen, natürlich die mysql mir sagt, dass die

+1

Sie sollten t alias für Hauptactive Modell – SiZE

+0

Ohh verwenden, habe ich wusste nicht, so dass eine Konvention für die yii ist? – Lefsler

Antwort

0

Dank Größe, die ich auf der yii mehrdeutig ist aktiviert, um den folgenden Text gefunden.

In relationalen AR-Abfrage, den Alias-Namen für den primären Tabelle ist als t festgelegt, während der Aliasname für eine relationale Tabelle standardmäßig mit dem entsprechenden Beziehungsnamen übereinstimmt.

Also, wie SiZE sagte, ist das t immer der Alias ​​für die Primärtabelle.

2

Standardmäßig Yii alias die primäre Tabelle in der SQL-Abfrage mit "t", aber es bedeutet nicht, dass Sie dabei bleiben müssen. Sie können es ändern, indem Sie „alias“ Eigentum von 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')); 

Der Zustand Parameter akzeptiert ein CDbCriteria Objekt, eine Array-artige CDbCriteria Eigenschaften oder eine Zeichenfolge zu setzen.

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

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

+0

Es hat nicht für mich funktioniert. – Lefsler