Drzewo typu id i idParent, problem z findAll

Cześć

W bazie danych mam następujące pola:

  • id

  • idParent

  • nazwa

  • sciezkaKategoriiID

  • poziom

Gdzie idParent to id krotki nadrzędnej. Poziom jest poziomem zagłębienia w drzewie, a ścieżka kategorii to wszystkie kategorie nadrzędne.

Mam zaimplementowaną relację w modelu kategorie:




	public function relations()

	{

		// NOTE: you may need to adjust the relation name and the related

		// class name for the relations automatically generated below.

		return array(

		    'podkategorie'=>array(self::HAS_MANY,'kategorie','idParent'), 

		);

	}



Chcę wykonać instrukcje:




        $kategorie = kategorie::model()->with('podkategorie')->findAll("idParent=:idParent",array(':idParent'=>$idParent));



Po wykonaniu intrukcji, yii zwraca mi błąd:

CDbCommand failed to execute the SQL statement: SQLSTATE[23000]: Integrity constraint violation: 1052 Column ‘idParent’ in where clause is ambiguous

Błąd ten mówi że mam dwa takie same nazwy kolumn w łączonych tabelach. Jak mogę dodać alias do tabeli łączonej w yii?

Zastosować alias t.idParent

Tak gawronzo tylko jak to napisać aby yii nie wyrzucał błędu? Za przykład byłbym bardzo wdzięczny.

Poprzez użycie aliasu w zapytaniu




ModelClass::model()->with(array('podkategorie'=>array('alias'=>'pkat'))->findAll();



W razie czego możesz też pokombinować z definicją relacji w modelu, popatrz na przykład poniżej (przypadek gdy w tabelce jest 2 graczy i oboje odwołują się do tej samej tabelki)




	public function relations()

	{

		return array(

			'games' => array(

            	self::HAS_MANY,

            	'Game',

            	'tournament_id',

            	'with'=>array(

                	'host.player'=>array('alias'=>'ah'),

                	'guest.player'=>array('alias'=>'ag')),

            	'together'=>true),

		);

	}



gawronzo miał rację. Wystarczylo dostawić t. w findAll. Wcześniej próbowałem z ??. ale to nie działało, nie wiem tylko dlaczego…

Aliasy zostały zmienione w wersji 1.1.0 z ?? na t

Powód dlaczego tak się działo. Masz dwie kolumny idParent, jedną pochodzącą z relacji podkategorie drugą z modelu kategoria. Pisząc warunek idParent = :idParent nie wskazujesz, o które idParent Ci chodzi. Zatem pisząc:

  • t.idParent wskazujesz, że chodzi Ci o tabelę kategorie;

  • podkategorie.idParent wskazujesz, że chodzi Ci o złączoną w relacji podkategorie tabelę kategorie.

Mój przykład dawał Ci taką sugestię, że jeśli masz w zapytaniu używaną tę samą tabelę co najmniej dwukrotnie, to musisz je rozróżnić poprzez alias (guest, host).