pillinetwork hesabınızla giriş yapın.

CakePHP'de ilişkilendirmeler

CakePHP'de modeller arasındaki ilişkilendirmeler diğer yazılarımda şurada ve şurada bahsetmiştim. Şimdi bu ilişkilendirmeleri daha ayrıntılı olarak inceleyeceğiz. CakePHP'de 4 ilişkilendirme bulunmaktadır:

  • hasOne
  • hasMany
  • belongsTo
  • hasAndBelongsToMany (HABTM)

hasOne
Bu ilişkilendirmede bir modele ait bir model bulunur.

1
2
3
4
5
6
7
<?php
class Kullanici extends AppModel
{
var $name = "Kullanici";
var $hasOne = "Profil";
}
?>

Burada Kullanici ve Profil adında iki farklı modelimiz var. İlişkilendirme sonucunda bir kullanıcının bir profili olur.
1
2
3
4
5
6
7
<?php
class Kullanici extends AppModel
{
var $name = "Kullanici";
var $hasOne = array("Profil"=>array("className"=>"Profil","dependent"=>true));
}
?>

Burada bir array kullanarak özellikleri biraz daha değiştirdik. İlk örnekteki ilişkilendirmelerde model isimlerinin de uygun olması gerekiyordu. Ama şimdi model ismini biz belirttiğimiz için sorun yok. "dependent" parametresini true yaptığımızda ise herhangi bir kullanıcı silindiğinde ona ait profil de silinir.

hasMany
Bir modele ait birden fazla model olduğunda bu ilişkilendirmeyi kullanırız.

1
2
3
4
5
6
7
<?php
class Anne extends AppModel
{
var $name = "Anne";
var $hasMany = "Cocuk";
}
?>

Anne ve Cocuk olmak üzere iki modelimiz var. İlişkilendirmeyle bir anneye ait birden fazla çocuk olduğunu belirtiyoruz. Bu ilişkilendirmede eğer belirtilmediyse model ismi Cocuk yerine Cocukanne olması gerekiyordu. Varsayılan ismi değiştirmek için şöyle yapabiliriz:
1
2
3
4
5
6
7
<?php
class Anne extends AppModel
{
var $name = "Anne";
var $hasMany = array("Cocuk"=>array("className"=>"Cocuk","foreignKey"=>"anne_id","dependent"=>true);
}
?>

Burada ilişkilendirdiğmiz modelin ismini (className) ve veritabanında ilişkilendirmenin yapıldığı anahtarı (foreignKey) belirttik. Bir çocuğun "anne_id" değeri 5 ise bu çocuk 5 numaralı id'si olan anneye aittir demektir. "dependent" parametresini true yaptığımız zaman, bir anneyi sildiğimizde ona ait tüm çocuklar da silinir.

belongsTo
Birden fazla model bir modele aitse bu ilişkilendirme kullanılır.

1
2
3
4
5
6
7
<?php
class Urun extends AppModel
{
var $name = "Urun";
var $belongsTo = array("Urunkategori"=>array("className"=>"Urunkategori","foreignKey"=>"urunkategori_id"));
}
?>

Her Urun modeli bir Urunkategori modeline aittir. Yani her ürünün bir kategorisi vardır ya da bir kategoriye ait birden fazla ürün vardır.

hasAndBelongsToMany (HABTM)
Bu ilişkilendirmeyi bir örnekle açıklayalım. Yazi ve Etiket olmak üzere iki modelimiz olsun. Bir yazının birden fazla etiketi olabilir. Aynı zamanda bir etiketin birden fazla yazısı vardır. Yani aynı etiket birden fazla yazıda olabilir. Böyle bir durumda ıHABTM kullanılır.

1
2
3
4
5
6
7
<?php
class Yazi extends AppModel
{
var $name = "Yazi";
var $hasAndBelongsToMany = array("Etiket"=>array("className"=>"Etiket","joinTable"=>"yazi_etiket","foreignKey"=>"yazi_id","associationForeignKey"=>"etiket_id","unique"=>true));
}
?>

array içinde kullandığımız parametreler:
className : İlişkilendirdiğimiz modelin adı
joinTable : ilişkilendirmelerin tutulduğu tablo ismi
foreignKey : bir modelin ait olduğu modelin id numarası .burada ise etiketin ait olduğu yazının id numarasıdır.
associationForeignKey : her yazının ait olduğu bir veya birden fazla etiket vardır. ait olduğu etiketin id numarasıdır.
unique : bu parametre true olduğunda, yeni bir ilişkilendirme kaydı eklerken foreign key tablosundan önce varolan ilişkilendirme kaydını siler ve güncellemeyi yapar. ( true varsayılan değerdir.)

/* ceyranci yazdı. 11 Mayıs 2009 14:13. 0 yorum var */

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

Bu Yazıyı Tutanlar

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.

pilliilan

son yorumlar

arama

pillinetwork