Yii Framework Forum: Drzewo typu id i idParent, problem z findAll - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Drzewo typu id i idParent, problem z findAll Rate Topic: -----

#1 User is offline   zegarmistrz001 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 06-April 09

Posted 29 September 2010 - 07:39 AM

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?
0

#2 User is offline   gawronzo 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 40
  • Joined: 10-November 09
  • Location:Poland/Lublin

Posted 29 September 2010 - 10:34 AM

Zastosować alias t.idParent
0

#3 User is offline   zegarmistrz001 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 06-April 09

Posted 29 September 2010 - 11:04 AM

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

#4 User is offline   aztech 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 205
  • Joined: 12-December 08
  • Location:Poland

Posted 30 September 2010 - 03:03 AM

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),
		);
	}

I'm not complete idiot... some parts are missing!
0

#5 User is offline   zegarmistrz001 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 34
  • Joined: 06-April 09

Posted 30 September 2010 - 05:34 AM

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

#6 User is offline   aztech 

  • Standard Member
  • PipPip
  • Yii
  • Group: Members
  • Posts: 205
  • Joined: 12-December 08
  • Location:Poland

Posted 01 October 2010 - 04:21 AM

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).
I'm not complete idiot... some parts are missing!
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users