Merhabalar bu yazıda PHP Faces ORM yapısını anlatmaya çalışacağım
ORM nedir? İlişkisel Nesne Eşleştirme (Object Relation Mapping) basit bir anlatımla veritabanındaki tablolara karşılık gelen sınıflar ve bu sınıfların özelliklerine göre SQL cümleleri üretebilen bir yazılım mimarisidir diyebiliriz.

Tablolarımıza karşılık gelen bu sınıflara genel anlamda Varlık(Entity) sınıfları adını veriyoruz. Nesne yönelimli programlamada her şey birer nesne olarak düşünülmeli O halde veri tabanındaki işlemlerimizde nesneler olarak düşünmeliyiz. İşte burada ORM bize veritabanındaki tablolarımızı nesneleştirmemizi ve CRUD(create, read, update, delete) işlemlerimizi bir nevi basitleştirmemizi sağlamakta.
Örnek vermek gerekirse veritabanımızda urun adında bir tablo olduğunu ve urun tablosu için PHP tarafında Urun adında bir varlık sınıfımızın olduğunu varsayalım. Veri tabanındaki urun tablosuna yeni bir urun eklemek için
$urun = new Urun();
$urun->adi=”CPU”
$urun->fiyat=”124”;
$urun->save();
PHP Faces ORM yapısından faydalana bilmeniz için PHP PDO eklentisini aktif durumda olmalı.
PDO eklentisini php.ini dosyasından aktif duruma getirebilirsiniz. windows işletim sistemi için uzantılar. dll şeklinde olacak şekilde ayarlanmalı.
extension = pdo.so
extension = pdo_sqlite.so
extension = sqlite.so
extension = pdo_mysql.so
Ayrıca PHP Faces ORM yı tek başına yani Faces frameworkten bağımsız bir şekilde de kullanabilirsiniz bu makalede yazılanları hem framework dâhilinde hemde sadece orm kullanarak gerçekleştirebilirsiniz.
PHP Faces ORM katmanının frameworkten ayrılmış hali için indirme bağlantısı aşağıda hemen zip dosyalarını çıkarıp çalışmaya başlayabilirsiniz.
http://php-orm-persistence.googlecode.com/files/php-orm.zip
Varlık sınıfları
Veritabanındaki tablolarınıza karşılık gelen varlık sınıfları Entity sınıfından genişletilir.
Tablonuzu varlık sınıfı ile eşleştirirken Açıklama Notu (Annotation) kullanırsınız bu hem kodunuzun okunabilirliğini sağlar hem de XML gibi başka bir dosyadan okumanın maliyetine katlanmaz kısacası XML ile eşlemeden daha verimlidir diyebiliriz.
Açıklama Notları ile Sınıfları eşleştirmek
PHP de Annotation kavramı henüz yerleşmemesine karşın Reflicaiton ile açıklama notları kullanılabilir.
Annotationlar açıklama satırları arasına @ et işareti kullanmak sureti ile oluşturulur.
Örneğin PHP Faces ORM da tablonuz ile sınıfınızı eşlemek için sınıf tanımlamasının üzerine @table notu eklenir. @Table notunun kullanımı aşağıdaki gibidir.
/**
* @Table(name = "urun")
*/
class Urun extends Entity{ }
Yukarıdaki açıklama satırı ile Urun sınıfını veritabanındaki urun tablosuyla eşleştirmiş olduk.
Veritabanındaki tabloların sütunları ile varlık sınıflarının private üyeleri eşleşebilir sütunlar ile sınıf üyelerinin eşleşmesini sağlamak için sınıf üyesinin tanımlandığı yerin üzerine @Column notu eklenerek kullanılır. Örneğin ürün tablosunda id, fiyat, ad sütunları bulunduğunu varsayarak.
/**
* @Table(name = "urun")
*/
class Urun extends Entity{
@Column(name = "id")
*/
private $no;
/**
@Column(name = "fiyat")
*/
private $name;
/**
@Column(name = "ad")
*/
private $adi;
}
Varlık sınıfımıza bulunması gereken iki önemli metot vardır get ve set metotları. Bu metotların eklenme sebebi ORM Update gibi SQL cümleleri oluştururken hangi bilgilin değiştirildiğini bilmek zorunda olmasıdır. Örneğin sadece adını değiştirdiğimiz bir ürünün id ve fiyat sütunlarının güncellenmemesi gerekmektedir. Kısacası ORM Hangi Sınıfların hangi alanlarının update edilmesi gerektiğini anlamalıdır. Gereksiz güncellemelerle sistemi yormamalıdır.
Get ve Set metodları aşağıdaki sınıf içerisindeki gibi kullanılabilir.
/**
* @Table(name = "urun")
*/
class Urun extends Entity{
@Column(name = "id")
*/
private $no;
/**
@Column(name = "fiyat")
*/
private $fiyat;
/**
@Column(name = "ad")
*/
private $adi;
public function set($name, $value) {
$this->$name= $value;
}
public function get($name) {
return $this->$name;
}
}
Birincil anahtar eşleştirmesi @Id notunun eşleşecek olan sınıf üyesinin tanımlandığı yerin üzerine yazılması sureti ile gerçekleştirilir. Urun @Id notu eklenmiş son hali aşağıdaki aşağıda ki gibi olacaktır
/**
* @Table(name = "urun")
*/
class Urun extends Entity{
@Id
@Column(name = "id")
*/
private $no;
/**
@Column(name = "fiyat")
*/
private $fiyat;
/**
@Column(name = "ad")
*/
private $adi;
public function set($name, $value) {
$this->$name= $value;
}
public function get($name) {
return $this->$name;
}
}
Basitlik olması adına bu örneğimizi PHP Faces framework haricinde uygulama yolunu seçiyorum dilerseniz bu örnekleri bir controller içerisinde de uygulayabilirsiniz.
Veri tabanı ile bağlantının yapılandırılması
http://php-orm-persistence.googlecode.com/files/php-orm.zip adresinden indirdiğiniz klasör içerisindeki config.php dosyasını düzenlemek üzere bir editor yardımı ile açıyoruz. Ve aşağıdaki satırları kendi veritabanı yapılandırmamıza göre değiştiriyoruz.
define(“DB_CONNECTION_STRING”,”mysql:host=localhost;dbname=veritabaniadi”);//sunucunuz ve veritabanı adı
define(“DB_USER”,”root”);//veritabanı kullanıcı adı
define(“DB_PASS”,”abc345″);//veri tabanı parolası
define(“DB_CONNECTOR”,”PDO”);//bu satırı değiştirmeyin
require_once “facespersistence/persistence.php”;// PHP ORM Persistence kütüphanesi
Şimdi yeni bir php dosyası içerisine index.php olabilir yukarıda oluşturduğumuz Urun varlık sınıfını içeren urun.php ve config.php dosyalarını dahil ediyoruz.
require_once “config.php”;
require_once “urun.php”;
PHP Faces varlık sınıflarını yönetebilmemiz için EntityManager adında bir sınıf sunmakta sorgulama kaydetme, silme gibi tüm işlemlerimizi bu sınıf yardımı ile gerçekleştiriyoruz. EntityManager’ın örneğini elde etmek için static getInstance metodunu kullanabilirsiniz.
Urun tablosuna yeni bir satır eklemek
require_once “config.php”;
require_once “urun.php”;
$urun = new Urun();
$session = EntityManager::getInstance();
$urun->adi=”LCD Monitor”;
$urun->fiyat=”450”;
$session->save($urun);
EnitityManeger’ın find metodu parametre olarak varlık sınıfı adi ve varlık sınıfını tanımlarken @Id ile tanımladığımız birincil anahtar değerlerini kabul eder. Veritabanında verilen değerle göre sorgulama yapar sorgulama sonucu bir kayıt bulunursa birinci parametre olarak verilen sınıf isminde veritabanındaki verilerle eşleşen bir nesne döndürür.
Örnek
Urun tablosundan bir kayıt seçmek ve seçilen kayıt’ı güncelleştirmek
require_once “config.php”;
require_once “urun.php”;
$session = EntityManager::getInstance();
$urun = $session->find(“Urun”,1);
$urun->fiyat=”399”;
$session->save($urun);
Hem yeni bir kayıt eklemek hem de var olan bir kayıt’ı güncellemek için save metodunun kullanılması sizi şaşırtmasın ORM hangi kayıtın veri tabanından depolandığının bilincindedir.
require_once “config.php”;
require_once “urun.php”;
$session = EntityManager::getInstance();
$urun = $session->find(“Urun”,1);
$urun->fiyat=”399”;
$session->save($urun);
nın bilincindedir.
EnitityManeger’ın delete metodu parametre olarak verilen varlık sınıfıyla eşleşen satırları veritabanından kaldırır.
require_once “config.php”;
require_once “urun.php”;
$session = EntityManager::getInstance();
$urun = $session->find(“Urun”,1);
$session->delete($urun);
Faces Orm da Varlık sınıfları arasında ilişkiler
Varlık sınıfları arasındaki ilişkiler veritabanını tasarlarken yaptığınız ilişkilendirmelere benzer Varlık sınıflarında tanımladığınız ilişkilerin tablolarda bulunması da gerekmez.
PHP faces daki 4 adet ilişkisel annotation vardır
@OneToOne (bire bir)
@OneToMany (bire çok)
@ManyToOne (bir çok a bir)
@ManyToMany (bir çok a bir çok)
Yukarıdaki dört annotationnında üç adet parametreleri bulunmaktadır
mappedBy = “Sınıf adı”
pk = ” birincil anahtar ”
fk = ” yabancı anahtar”
Urun tablomuzda yorumlar adında bir tabloya bir e çok ilişki bulunduğunu ve yorumlar adında da bir varlık sınıfımızın olduğunu varsayalım.

bire çok ve birçok a birçok ilişkilerde çok olan taraf bir ArrayObject olarak tanımlanmalıdır.
/**
* @Table(name = "urun")
*/
class Urun extends Entity{
@Id
@Column(name = "id")
*/
private $no;
/**
@Column(name = "fiyat")
*/
private $fiyat;
/**
@Column(name = "ad")
*/
private $adi;
/**
* @OneToMany(mappedBy ="Yorumlar", pk= "no", fk= "urunno")
*/
private $yorumlar;
public function Urun(){
parent::Entity();
$this->yorumlar = new ArrayObject();
}
public function set($name, $value) {
$this->$name= $value;
}
public function get($name) {
return $this->$name;
}
}
Yorumlar tablosu için varlık sınıfı bir yorum bir urun için yapılabileceği için yorumlar sınıfındaki ilişki tanımlaması @OneToOne şeklinde olmalıdır.
/**
* @Table(name = "yorumlar")
*/
class Yorumlar extends Entity
{
/**
* @Id
* @Column(name = "no")
*/
private $no;
/**
* @Column(name = "urunno")
* @OneToOne(mappedBy = "Urun", pk= "no", fk= "id")
*/
private $urunno;
/**
* @Column(name = "yorum")
*/
private $yorum;
function get($name) {
return $this->$name;
}
function set($name,$value) {
$this->$name = $value;
}
function yorumlar($yorum = null)
{
$this->yorum= $yorum;
}
}
Urun sınıfımızın yorumlar ismindeki üyesine erişerek yeni yorumlar ekleyelim
require_once "config.php"; require_once "urun.php"; require_once "yorumlar.php"; $session = EntityManager::getInstance(); $urun = $session->find(“Urun”,1); $urun->fiyat=222; $urun->yorumlar->append(new Yorum(“Bu bir denemedir yorum 1”)); $urun->yorumlar->append(new Yorum(“ORM gerçekten kullanışlıdır buda yorum 2”)); $session->save($urun);
Yukarıdaki Tek bir save satırı veritabanında 3 SQL cümlesi işletilir Yukarıda bahsettiğim gibi ORM hangi sınıfların veritabanından hangi sınıfların dışarıdan oluşturulduğunu algılayabilme kabiliyetine sahip olmalıdır. Sonuçda urun nesnesi için update, urun sınıfın new ile oluşturulmuş her bir yorum nesnesi için insert cümleleri oluşturulur ve işletilir.
Yorumları aşağıdaki gibi listeleyebiliriz
Foreach($urun->yorumlar as $oku)
Echo $oku->yorum;
Yorum sınıfı urun sınıfın üyesi Urun sınıfı da yorum sınıfının üyesidir yorum nesnelerinden de urun’e ulaşılabilir. Tüm ilişkili varlık sınıfı nesneleri birbiriyle öz yinelemeli bir tekrar içindedirler ve bir birlerinin örneklerini referans olarak barındırırlar
Örnekler
$urun->yorumlar[0]->id; $urun->yorumlar[0]->urun->adi; $yorum->urun->adi; $yorum->urun->yorumlar[1]->yorum->urun->adi; $yorum->urun->yorumlar[0]->yorum->yorumlar[1]->urun->adi->yorumlar[3]->yorum;
Varlık sınıfı oluşturucu (Entity Generator) programı
Varlık sınıflarını kendiniz yazmak zorunda değilsiniz siz sadece veritabanınızı tasarlayın bu program varlık sınıflarını sizin için oluşturacaktır. Ancak tablolar arasıdaki ilişkileri tablolarınızı oluştururken tanımlayım bu program ilişkileri tanır.
http://php-faces.googlecode.com/files/generator.zip programı bu adresten indirebilirsinin unutmadan programın çalışabilmesi için sisteminizde JVM bulunmalı! generator.jar isimli dosyayı çalıştırdığınızda kaşınıza aşağıdaki gibi bir pencere gelecek buradan gerekli ayarlamaları yapıp generate butonuna basın ve varlık sınıflarının kayıt edileceği dizini secin. Bundan sonra PHP faces entity generator programının sizin için nasıl PHP kodladığını görün.

Sorgulamalar
Faces ORM üzerinde iki çeşit sorgulama şekli vardır SQL ve FQL (Faces Query Language)
FQL sorguları işletmek için EntityManager’ın createQuery metodu kullanılır. Bu metot string bir parametre alır ve bir Query nesnesi döndürür. Query nesnesi PDOStatement nesnesinden genişletilmiştir.
Query EntityManager::createQuery(String FQL)
Örnek
$em= EntityManager::getInstance();
$query = $em->createQuery("SELECT u FROM urun u WHERE u.id =:id");
$id=11;
$query->bindParam("id", $id);
$query->execute();
print_r($query->getResultList())
SQL sorguları işletmek için EntityManager’ın nativeQuery metodu kullanılır. Bu metot string bir parametre alır ve bir Query nesnesi döndürür.
Query EntityManager::nativeQuery(String SQL)
Örnek
$em= EntityManager::getInstance();
$query = $em->createQuery("SELECT * FROM urun WHERE id = 11");
$query->execute();
Faces ORM FQL (Faces Query Language)
FQL varlık nesneleri üzerinde sorgulama yapmanıza olanak tanıyan SQL e benzer bir sorgulama dilidir. FQL Sorguları PHP Faces Framework tarafından doğal SQL sözcüklerine dönüştürülür.
SELECT İfadesi
SELECT takmaisim FROM sıfıfadı takmaisim WHERE having vb..
Örnekler
SELECT b from Blog b SELECT c from Categories c SELECT b from Blog b WHERE bi.id = 1 SELECT b from Blog b WHERE bi.id = 1 and b.name=‘www’ SELECT b from Blog b limit 0,5 SELECT c from Categories c GROUP BY c.id HAVING AVG(c.id) > 1
FQL ile birlikte SQL fonksiyonları kullanımı
SELECT COUNT(b.id) FROM Blog b
SELECT MAX(b.id) FROM Blog b
entitymanager ile beraber kullanımına örnek
$query= $this->em->createQuery("SELECT count(b.id) from bir b");
$query->execute();
echo query->getSingle();
FQL de İç içe geçmiş alt sorgular
SELECT b FROM Blog b WHERE b.coment.id =(SELECT MAX(c.id) FROM Comment c) SELECT o FROM Object o WHERE o.id = (SELECT AVG(i.id) FROM Object i) ORDER BY o.name
Hüseyin Bora ABACI
Blog
ÇOK OKUNANLAR
- Firefox' un Işık Hızı Eklentisi 0 yorum | 88 view(s) per day
- Windows 7 Antivürüsü: Scareware 0 yorum | 58 view(s) per day
- Google Chrome 6.0 0 yorum | 49 view(s) per day
- Freelance Web Tasarımcı Aranıyor 0 yorum | 31 view(s) per day
- Windows Server 2008 R2 0 yorum | 31 view(s) per day
- Yeni Sosyal İletişim Ağı : Ping 1 yorum | 30 view(s) per day
- Ücretsiz İnternet Otobüslerde 0 yorum | 29 view(s) per day
- Agile(Çevik) Modelleme ve Çevik Yazılım Geliştirme 0 yorum | 27 view(s) per day
- Banka İçin Uygulama Geliştirme Uzmanları Aranıyor 0 yorum | 26 view(s) per day
- LinkZ - Lead Software Developer 0 yorum | 26 view(s) per day
Yorumlar
GERİ BİLDİRİMLER
Geri bildirim yok.Yorum yapmak için giriş yapınız.







