2010-01-26 10 views
37

CodeIgniter ile başlıyorum ve birkaç saat sonra Google'da dalış yaptıktan sonra biraz kafam karıştı.CodeIgniter, modeller ve ORM, bunun nasıl ele alınacağı?

Sorgumu kolay bir örnekle açıklamaya çalışalım: 'name' ve 'color' alanlarına sahip bir 'arabam' tablom var.

$car = new Car('BMW', 'red'); //new $car Object 
$car->save(); //this will make an SQL insert to the table 'car' 

//Lets query all cars 
$cars = Car::get_all(); 
//cars will be an array of Car objects, (not a set of rows!) 

nedenle, sana RubyOnRails veya Django (Python) ne var oldukça benzer bir şey arıyorum: Bu nedenle benim kod aşağıdaki gibi nihayet bakmak böylece, bir php sınıfı Car sahip olmak istiyorum. Her türlü ilişkiyi yürütmem ve doğru bir OOP + MVC yolunda kod yazabilmem gerekiyor.

Bunlar benim başarısız it almak için yaklaşımlar şunlardır: Harici ORM kullanma

(DataMapper, Doktrin, AcidCrud ...)

Onlar çok fazla ayarları gerektirir ya, ya da bir ilişkileri ele Zavallı yol

class Car extends Model{ 
public function Car($name='',$color='') 
{ 
    $this->name  = $name; 
    $this->color = $color;  
    parent::Model(); 
} 
public function save() 
{ 
    $data = array(
        'name' => $this->name , 
        'color' => $this->color 
       ); 

    $this->db->insert('cars' $data); 
} 

Ve daha neler ... Bu yaklaşım ile Problem (CodeIgniter'ın Modeli sınıfını genişletmek için) CodeIgniter'ın sınıflarını kullanma

Ben bir eğer bir $ araba nesnesinin bir var_dump() yapmak olduğunu CodeIgniter'den CI_Config, CI_Input, CI_Benchmark vb. nesneler gibi pek çok şey içerdiğini görüyorum. Bu yüzden, bunun iyi bir çözüm olmadığını düşünüyorum, çünkü sınıfımın her bir nesnesi, çok sayıda tekrarlanan veri içerecektir. , (zayıf bir performansa sahip olacak!), değil mi? CodeIgniter'ın modellerini kullanmama

ben (yerine fonksiyon Car() ait) __construct() CodeIgniter'ın Modeli sınıfından onları uzanan ve daha sonra düzenli PHP5 yapıcı kullanmadan Modellerimi yapmak, ancak sorun içinde olabilir

Bu durumda: CodeIgniter ActiveRecord kullanarak querys yapmak için $ db nesnesine nasıl erişebilirim? ve modelleri (sınıfları) denetleyicilere nasıl yüklerim?

+3

İyi soruyla itmek bütünleştirmektedir, CodeIgniter modelleri çaba gerektirir. Modellerdeki formları tanımlamak ve doğrulamak isterim. Belki Doktrinin bazı mashup ve form kütüphanesi yeterli olacaktır. – Keyo

+1

Rails ve Django ile tecrübeniz varsa, PHP'yi neden kullanmak istiyorsunuz? – denysonique

+0

[RedBean] (http://www.redbeanphp.com), ORM –

cevap

14

için CodeIgniter wiki sayfasını bakmak atın:

class Cars { 

    //List all neccessary vars here 

    function __construct() { 
     //get instance of Codeigniter Object and load database library 
     $this->obj =& get_instance(); 
     $this->obj->load->database(); 
    } 

//You can now list methods like so: 
function selectCar($name, $color) { 

     $this->obj->db->select('color')->from('car')->where('color', $color); 
     $query = $this->obj->db->get(); 

     switch ($query->num_rows()) { 
     case 0: 
      return false; 
      break; 
     default: 
      return $query->result(); 
      break; 
     } 
    } 

Umut yardımcı olur!

+0

Bu sınıfın Codeigniter Modelinin dışında olduğunu unutmayın - Muhtemelen/system/application/library dizinlerine yerleştirmeli ve sonra $ this-> load-> library ('cars') kullanarak yükleyiniz; –

+11

Bu, ORM değildir. Bu temelde bir nesnenin içindeki veritabanı soyutlama kitaplığına erişmektir. –

+4

Hiçbir zaman bir ORM çözümü için açıkça belirtmemişti ve bunun ORM olduğunu söylemedim. Ayrıca, seçilen cevabı reddetmek biraz küçümsüyor gibi görünüyor, değil mi? –

4

Muhtemelen böyle bir şey istediğiniz bir ORM

http://codeigniter.com/wiki/ORM/

+0

'u kullanmanın son derece kolay bir yoludur. Bunu okudum ve daha kafam karıştı. Harici ORM hariç (benim durumumda iyi bir yaklaşım olmadığını düşündüğüm gibi), bunun arasındaki fark nedir: http://codeigniter.com/user_guide/database/active_record.html ve bu: Http://codeigniter.com/wiki/ActiveRecord_Class/ –

9

Doctrine ile deneyin, harika bir ORM'dir ve CodeIgniter'e kolayca entegre edilebilir.

+0

Sonunda bunu yaptım. Bu eğitim oldukça kullanışlıdır: http://www.phpandstuff.com/articles/codeigniter-with-doctrine-sample-code-screencast –

+0

Doktrin gerçekten harika ve öğretici çok kullanışlıdır. çok bu bağlantıları Oku (yararlı olabilir): http://www.doctrine-project.org/documentation/manual/1_2/nl/caching ve http://www.doctrine-project.org/documentation/manual/1_2/tr/improvement-performance –

2

Propel'i codeigniter ile kullanırken bol şansım vardı.

+0

referans için linki paylaşın – sandipshirsale

1

Ne yapmak istediğiniz ActiveRecord sınıfını genişleten bir kitaplık oluşturmaktır.Bazı insanlar Önünüze şunlardır:

http://codeigniter.com/wiki/ActiveRecord_Class/

iyi mods iplik burada,:

http://codeigniter.com/forums/viewthread/101987/

sadece uzatmak, uygulamanıza geneldir ORM yöntemlerine arıyorsanız ActiveRecord sınıfı. Benim uygulamam için, bir tablonun yapısını bilmek, iskeleler (otomatik oluştur) formlarımı oluşturmamı ve başka bir eşleme yapmamı sağlıyor. API-API eşlemesi yapıyorum, bu yüzden MyActiveRecord'da bir GetStructure() yöntemini dahil ediyorum ve oradan başka şeyler inşa ediyorum.

(RoR gülüp şimdi çekip olabilir)

Düzenleme: Doktrin kapsamında ve güç bir fan olduğum sürece, ben CI ruhu ötesinde komut satırı kullanım yerleri bunu talep olduğunu düşünüyorum. Sizin için doğru olan şey sizin için doğru olanıdır, ancak Doktrini kullanacaksam, Symfony'yi de kullanabilirim, değil mi? Ya da RoR, bu konuda doğru mu? Bununla ne yapacağımı görüyor musun? Doğru zaman için doğru araç.

+0

CodeIgniter için Doktrinin çok 'ağır' olduğuna katılmıyorum. "Komut satırı kullanımı" (bir komut satırı aracılığıyla olmak zorunda değilsiniz - model neslini bir CI denetleyicisine kolayca yerleştirebilir ve web'den arayabilir) basitçe miktarı önemli ölçüde azaltan model tanımları üretmektir işlerini yapmak için CodeIgniter içinde yapmanız gereken iş. Zihnimde CI'nin ruhu, her şeyden hızlı gelişme hızıyla ilgilidir ve Doktrin bununla büyük ölçüde yardımcı olur. –

1

CodeIgniter'i Propel ile kullandım ve gerçekten iyi karıştılar. Bir süredir böyle kullandım ve bu şekilde çalışan birkaç webapps var. Bunu yapmak için birkaç korkunç yollar bulduğumdan (bazı Apache'nin yapılandırmasını değiştirerek dahil!). Nasıl yapılacağına dair bir blog yazısı yayınlamaya karar verdim. here'u okuyabilirsiniz. Ben yardımcı olabilir

Umut!

gelecek Google'cuların için
+0

Merhaba @David Conde Mesajınızı okudum, "Başlamanın en iyi yolu Propel’in çalışma zamanını bu klasöre kopyalamak" ile ne demek istediğinizi netleştirebilir misiniz?Pervanenin tamamını mı kastediyorsun? Ya da belirli bir klasör? – pollux1er

3

, here is a tutorial Sana herhangi bir sorun varsa bana bildirin Doktrin 2.

ile CodeIgniter'ı 2 bütünleştirmek konusunda belirtilmiş.

2

GAS ORM kullanıma hazırdır, oldukça iyi, kullanışlı ve kullanımı kolaydır. CodeIgniter bu ORM uygulama bazı özellikleri:

  • Desteklenen veritabanları: cubrid, mssql, mysql, oci8, odbc, postgre, sqlite, sqlsrv. (CI repo ile eşitlemeyi sürdürürseniz PDO dahil) Birden çok veritabanı bağlantısını destekler.
  • Birden çok ilişkiyi destekler.
  • Bileşik anahtarları destekler (ilişkileri tanımlayan anahtar için).
  • Veritabanı tablolarından otomatik modeller oluşturun ve bunun tersini yapın.
  • Model tablolarını, geçişler dosyası oluşturarak otomatik olarak senkronize edin.
  • İsteğe bağlı önbelleğe alma.
  • Kendinden referanslı ve bitişik sütun/veri (hiyerarşik veriler).
  • Eager İlişkilendirmelerinizi en üst düzeye çıkarmak için yükleme (performans için).
  • Çeşitli bulucu yöntemleri (çoğu CI AR ile zincirlenebilir) ve agregalar.
  • Minimum kurulum ile doğrulama ve otomatik eşleme giriş koleksiyonu.
  • Hooks, modelinizin kontrolünü ele alır.
  • Ortak işlevinizi/kitaplığınızı modelinizde paylaşmaya yönelik uzantılar.
  • İşlemler ve diğer CI AR iyiliği.
  • API tutarlılığının çoğunu sağlamak için phpunit test paketini dahil.

kıvılcım destekli tek bir formu vardır -> ben php-activerecord çok iyi bir drop-in ORM olduğunu düşünüyorum

0

yüklemek kolaydır böylece. Bunu Slim Framework ile birkaç kez kullandım ve CI'nin yerel model sınıfını kullanmanın harika bir alternatif olacağını düşünüyorum. İşte bazı örnek kod ve link:

$post = new Post(); 
$post->title = 'My first blog post!!'; 
$post->author_id = 5; 
$post->save(); 

PHP ActiveRecord

İlgili konular