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.
|
|
| <?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.
|
|
| <?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.
|
|
| <?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:
|
|
| <?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.
|
|
| <?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.
|
|
| <?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.)