yii model de findByPk, findAll, findByAttributes, dataprovider kullanımı

Yii de oluşturduğunuz modellerin, controller ve view dosyalarında en çok kullandığımız özelliklerden bahsedelim.

1- primary key ile kayıt detayını getirmek – findByPk

2- tablonun herhangi bir sütun/sütunları na göre kayıt/kayıtlar getirmek – findAll, findByAttributes

3- where koşuluna göre kayıt/kayıtlar getirmek ve sayfalama yapmak – dataprovider

4-  zii.widgets.grid.CGridView ile kayıtları listelemek

1- primary key ile kayıt detayını getirmek – findByPk

haberModel.php modelinde haber primary key e göre tek bir kaydın bilgilerini alacaksınız. Örnek kullanım :

haberModel.php

public function loadModel($haberid) {

$model = $this->findByPk($haberid);

if ($model === null)
throw new CHttpException(404, 'Kayıt bulunamadı!');
return $model;

}

siteController.php

// haber detay view action /view/site/haberdetay.php
public function actionHaberdetay() {

if(isset($_GET['haberid'])){
$model = haberModel::model()->loadModel($_GET['haberid']);
// eğer kayıt bulunamazsa loadModelde 404 e düşecek
$this->render('haberdetay', array('modelHaber'=>$model));
}

}

throw new CHttpException(404, ‘Kayıt bulunamadı!’); satırı site/error.php , siteController içindeki actionError() fonksiyonunu tetiklemektedir.

/view/site/haberdetay.php

..</pre>
<h2></h2>
<div class="icerik">Tarih :haber_tarihi);?>
haber_icerik);?></div>
<pre>
2- tablonun herhangi bir sütun/sütunları na göre kayıt/kayıtlar getirmek – findAll, findByAttributes

Tablonuzda herhangi bir sütundaki belli değerleri almak istiyorsunuz. Örneğin bugün eklenen haberleri getiren fonksiyonu yazalım.

findAll() ile;
siteController.php

public function actionHaberbugun(){

// ufaktan criteria kullanımından da bahsetmiş olduk

$where = new CDbCriteria;
$where->compare('haber_tarihi', date('Y-m-d'));
$where->select = 't.haber_id,t.haber_baslik';

$haberlistesi = HaberModel::model()->findAll($where);

$this->render('haberbugun', array('haberlistesi'=> $haberlistesi));

}

Buradaki $haberlistesi bir dataProvider nesnesi olarak gelir, view dosyanıza “zii.widgets.grid.CGridView” modülünü kullarak listeletebilirsiniz.(Kullanımı makalenin sonunda vardır)
İsterseniz gelen kayıtları bir diziye atayabilirsiniz.

//key : haber_id , value : haber_baslik
$haberArray = CHtml::listData($haberlistesi, 'haber_id','haber_baslik');

- findByAttributes() ile;
criteria kullanmadan örnek
siteController.php

public function actionHaberbugun(){

$haberlistesi = HaberModel::model()->findByAttributes(array('haber_tarihi' => date('Y-m-d')));

$this->render('haberbugun', array('haberlistesi'=> $haberlistesi));

}

findByAttributes fonksiyonunda ilk değerde eşleşme bire birdir. Like,büyüktür,limit,join,having,group  vs işlemleri için dataProvider kullanmanız daha uygun olur.   findByAttributes de array içerisine birden fazla sütun adı ve değeri yazabilirsiniz. Ayrıca criteria nesnesinide kullanabilir ya da sql yazabilirsiniz. Örnek olarak:

public function actionHaberbugun(){

// 1.YÖNTEM SQL : deneme kelimesi içeren bugün eklenen haberler vs.
$haberlistesi = HaberModel::model()->findByAttributes(array('haber_tarihi' => date('Y-m-d')),"haber_baslik like '%DENEME%'");
// 2. YÖNTEM CRITERIA
$where = new CDbCriteria;
$where->compare('haber_baslik', 'DENEME',true); // true like kullanmasını söyler
$haberlistesi = haberModel::model()->findByAttributes(array('haber_tarihi' => date('Y-m-d')),$where);
$this->render('haberbugun', array('haberlistesi'=> $haberlistesi));

}

Görüldüğü gibi findByAttributes kullanımı yazılımcının yazım şekline göre değişir.

3- where koşuluna göre kayıt/kayıtlar getirmek  ve relation kullanmak- dataprovider

siteController.php

public function actionHaberbugun(){
$criteria = new CDbCriteria;
 $criteria->compare('haber_baslik', 'DENEME', true);
 $criteria->compare('haber_tarihi', date('Y-m-d'));
 $haberliste = new CActiveDataProvider(
'haberModel', // kullanacağı modelin adı
array(
'criteria' => $criteria,
'pagination' => array('pageSize' => 20), // sayfalamadaki sayı
'sort' => array('defaultOrder' => 'haber_id desc') // sıralama koşulu
)
);
$this->render('haberbugun', array('haberliste'=>$haberliste));
}

Görüldüğü gibi en kolay ve anlaşılır kayıt listeleme dataProvider ile yapılabilmektedir. dataProvider kullanımı çok kapsamlı olduğundan şuanlık basit kullanımına yer verdim sonraki konularda daha geniş anlatımına yer vereceğim.

 4-  zii.widgets.grid.CGridView ile kayıtları listelemek

Yukarıdaki 2,3 ve 4 deki yöntemlerden herhangi birisi ile kaydınızı almış olalım ve view dosyanızda listemek için gridView ile gösterimini ekleyelim.

/view/site/haberbugun.php

// html kod
...
widget('zii.widgets.grid.CGridView', array(
'id' => 'haber-grid',
'template' => '{items}{summary}{pager}',
'dataProvider' => $haberliste ,
'columns' => array(
array(
'type' => 'raw',
'name' => 'haber_baslik',
'value' => 'CHtml::decode("<a href="\&quot;/&quot;.$data-">haber_id."\">".$data->haber_baslik."</a>")',
'htmlOptions' => array('width' => '110'), // td genişliği
),
array(
'type' => 'raw',
'name' => 'haber_tarih',
'value' => 'myfunc::DateFormat($data->haber_tarihi)',
'htmlOptions' => array('width' => '50'), // td genişliği
),
array(
header =>'',
'value' => 'CHtml::decode("<a href="\&quot;/&quot;.$data-">haber_id."\">Haber Detayı</a>")',
'htmlOptions' => array('width' => '15'), // td genişliği
))
));
?>
..
//html kod

‘template’ => ‘{items}{summary}{pager}’, Grid yapınızı belirtebilirsiniz;

items:kayıtlarınızın listelendiği tablo,

summary: “Toplam kayıt 50. şuan 20-40 arası görüntüleniyor” gibi bilgi metinin bulunduğu alandır.

pager: sayfa numaralarının bulunduğu alandır.
İstediğiniz gibi düzenleyebilir kaldırabilirsiniz. 

...
'id' => 'haber-grid',
'template' => '</pre>
<div>{summary}{pager}</div>
<div>{items}</div>
<div>{summary}{pager}</div>
<pre>',
...

columns  objesini eklemezseniz dataProvider select değerine ne yazmışsanız onları listeler , orayada bişey yazmamışsanız tablonuzun tüm sütunlarını listeler .

‘value’ => ‘CHtml::decode(“<a href=\”/”.$data->haber_id.”\”>”.$data->haber_baslik.”</a>”)’, Verilerinizi istediğiniz formatta gösterebilirsiniz. $data objesi ile dataProvider, kayıtlar için döngüsünü kurarken ilgili kaydı almanızı sağlar. foreach($array => $val) örneğindeki $val gibi -tabi bu dizi ama mantık aynı-

value’ => ‘myfunc::DateFormat($data->haber_tarihi)’, Bu kısım çok ihtiyacınız olabilecek bir kullanımdır. Kendinizin oluşturduğu bir fonksiyona değeri göndererek istediğiniz çıktıyı gösterebilirsiniz. Ben myfunc classında DateFormat isimli “Y-m-d” olarak gelen tarihi “d.m.Y” şekline çeviren bir fonksiyon tanımladım ve çağırdım. Grid de haber tarihi sütununda kayıtlarım 12.01.2012 şeklinde görünecek.

array(
header =>”,
‘value’ => ‘CHtml::decode(“<a href=\”/”.$data->haber_id.”\”>Haber Detayı</a>”)’,
‘htmlOptions’ => array(‘width’ => ’15′), // td genişliği
)
Sanırım en güzel özelliği Gridinize sizinde sutun ekleyebilme imkanınızdır. Yukarıdaki gibi bir kullanım ile sütun ekleyebilir, her kayıt için tekrarlanmasını sağlayabilirsiniz.

 

Facebook Twitter Friendfeed

Leave a Reply

Your email address will not be published. Required fields are marked *

*


*

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>