CDbCriteria

Birbiri ile ilişkili 3 tablom var. Adlarına Tablo1, Tablo2, Tablo3 diyelim.

İçlerinde aşağıdaki gibi.

Tablo1 = ID , TABLO2ID

Tablo2 = ID , TABLO3ID

Tablo3 = ID , ISIM

Tablo1 üzerinden gidiyorum ve ilişkiler şu şekilde.


'tABLO2' => array(self::BELONGS_TO, 'Tablo2 ', 'TABLO2ID')

Tablo2 ilişkisi


'tABLO3' => array(self::BELONGS_TO, 'Tablo3', 'TABLO3ID')

Normalde listelerken şu şekilde çağırdın zaman çalışıyor;


$criteria=new CDbCriteria;

$criteria->with = array('tABLO2');

$criteria->together = true;

return new CActiveDataProvider('Tablo1', array('criteria'=>$criteria,));

Model Tablo1 verileri olsun ve Yii nin standart "admin" sayfasındaki gridview ile listelendiğini düşünelim.


	array('value'=>'$data->tABLO2->tABLO3->ISIM'),

Yani $model den okuyor -> "tABLO2" ilişki adını yazınca ilişkiye gidiyor, o ilişki üzerinde var olan diğer ilişkiyi çağırıyor, "tABLO3" ile o tablonun bağlı olduğu alanı getiriyor.

Böyle karmaşık bir yapı bu şekilde işleniyor ve sorun çıkmadan çalışıyor.

Benim 2 sorum var;

[color="#8B0000"]1.[/color] Yukarıdaki verdiğim örnekteki "admin" sayfasında çalışan örnek yine aynı çalışma mantığı olduğunu zannettiğim aşağıdaki "criteria" kodu


$criteria->compare('tABLO2.tABLO3.ISIM',$birdeger,true); 

neden çalışmıyor olabilir ?

Verdiği hata da "tABLO2" devamı "Tablo3.ISIM" kısmı için, böyle bir tablo tanımlı değil diyor.

[color="#8B0000"]2.[/color] Tabloyu bulamadığı için kendim join ile eklemek istiyorum . İlişkili olarak daha evelden "with" ve "join" de beraber kullandığım, syntax yapısında da bir sorun çıkarmayan bir kod yapısı ile ekletiyorum. Kod ;




$criteria->join  = 'LEFT JOIN Tablo3 ON tABLO2.TABLO3ID = Tablo3.ID';

Burada da sorun yok ancak sql çıktısana baktığımda, benim eklediğim "join" ilişkili gelen "with" in eklediği join cümlerinin başına geldiği için doğal olarak "tABLO2.TABLO3ID" yi tanımlıyamıyor. Bu sıralama hatasını nasıl giderebilirim ?

Not : Sıralama olarak zaten with in altında yazıyorum $criteria->join kodunu.

Mantık sıralaması olarak şu şekildeymiş;

Önce kendi içersindeki cümleleri alıp SQL başına ekliyor sonra ilişkilere geçiyormuş.

Bu yüzden bağlamak için uraştığım join cümlesini tablo1’in miş gibi değilde tablo2’nin join cümlesiymiş gibi göstermek için scope kullandım.

Tablo2 model :




public function scopes()

{

return array(

'scopebaglanti'=>array('join'=> 'LEFT JOIN Tablo3 ON tABLO2.TABLO3ID = Tablo3.ID'),);

}

Tablo1 in içerisindeki with kodu da şu şekilde değişti;


$criteria->with = array('tABLO2:scopebaglanti');

Tabi bu scope’u içerisinde ‘tABLO2’ adlı relationı olmadan çağırırsanız join cümlesindeki ilişki adını bulamicağı için hata vericektir.

Böylelikle birçok konuya değinmişde oldum. Umarım başkalarına örnek teşkil ediyordur. :)

Teşekkürler

teşşekürler kardeş güzel paylaşım :)