2010-01-26 8 views
37

Ich beginne mit CodeIgniter und nach einigen Stunden Tauchen in Google bin ich ein bisschen verwirrt.CodeIgniter, Modelle und ORM, wie geht man damit um?

Lassen Sie uns versuchen, meine Frage mit einem einfachen Beispiel zu erklären: Ich habe eine Tabelle 'Auto' mit den Feldern 'Name' und 'Farbe'. Deshalb möchte ich eine PHP-Klasse Auto haben, so dass mein Code schließlich könnte wie folgt aussehen:

$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!) 

Deshalb suche ich nach etwas ziemlich ähnlich, was Sie haben in RubyOnRails oder Django (Python). Ich muss alle Arten von Beziehungen handhaben und Code in einer echten OOP + MVC-Art schreiben können.

ist meine gescheiterten Ansätze sind es zu bekommen:

ein externen ORM (DataMapper, Lehre, AcidCrud ...)

Sie entweder zu viele Einstellungen erfordern, oder sie behandeln Beziehungen in einem schlechter Weg.

Mit CodeIgniter Klassen (zum Modell Klasse CodeIgniter zu verlängern)

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); 
} 

Und so weiter ... Problem mit diesem Ansatz ist, dass ein, wenn ein var_dump tun() eines Objekts $ Auto, ich siehe, dass es eine Menge Zeug aus dem CodeIgniter enthält, wie die Objekte CI_Config, CI_Input, CI_Benchmark, etc. Daher denke ich, dass dies keine gute Lösung ist, da jedes Objekt meiner Klasse Auto viele wiederholte Daten enthalten wird (Es wird eine schlechte Leistung haben!), nicht wahr?

Nicht die Modelle des CodeIgniter mit

ich meine Modellen sie von CodeIgniter Modell Klasse machen könnte, ohne erstreckt, und dann mit dem regulären PHP5 Konstruktor (__construct() statt Funktion Auto()), aber Problem in Dieser Fall ist: wie ich auf das $ db-Objekt zugreifen, um Querys mit ActiveRecord des CodeIgniter zu machen? und wie lade ich die Modelle (ihre Klassen) in die Controller?

+3

Gute Frage treiben integrate, die codeigniter Modelle erfordern viel Aufwand bei der hierarchischen Daten zu manipulieren. Ich würde gerne Formen in Modellen definieren und validieren. Vielleicht genügen ein bisschen Mashup von Doctrine und die Formularbibliothek. – Keyo

+1

Warum möchten Sie PHP verwenden, wenn Sie Erfahrung mit Rails und Django haben? – denysonique

+0

[RedBean] (http://www.redbeanphp.com) ist eine große sehr einfach zu bedienen ORM –

Antwort

14

die die codeigniter Wiki-Seite für ORM sehen Sie so etwas wie dies wahrscheinlich wollen:

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; 
     } 
    } 

Hoffnung, das hilft!

+0

Beachten Sie, dass diese Klasse außerhalb des Codeigniter-Modells liegt - Sie sollten es wahrscheinlich in/system/application/libraries platzieren und dann mit $ this-> load-> library ('cars') laden; –

+11

Dies ist überhaupt kein ORM. Dies ist im Grunde nur Zugriff auf die Datenbankabstraktionsbibliothek innerhalb eines Objekts. –

+4

Er hat nie explizit für eine ORM-Lösung angegeben, und ich habe nie gesagt, das sei ORM. Auch scheint es ein wenig herablassend, die gewählte Antwort zu verwerfen, finden Sie nicht? –

4
+0

Ich lese das und ich bin mehr verwirrt. Ausgenommen das externe ORM (wie ich sagte, ich denke, dass sie in meinem Fall kein guter Ansatz sind), wissen Sie, was ist der Unterschied zwischen diesem: http://codeigniter.com/user_guide/database/active_record.html und dies: http://codeigniter.com/wiki/ActiveRecord_Class/ ? –

9

Mit Doctrine versuchen, ist eine große ORM und kann problemlos in CodeIgniter integriert werden.

+0

Endlich habe ich das gemacht. Dieses Tutorial war sehr nützlich: http://www.phpandstuff.com/articles/codeignit-with-doctrine-sample-code-screencast –

+0

Lehre ist wirklich erstaunlich, und das Tutorial ist sehr nützlich. diese Links Lesen Sie auch (könnte sehr nützlich sein): http://www.doctrine-project.org/documentation/manual/1_2/nl/caching und http://www.doctrine-project.org/documentation/manual/1_2/de/improving-performance –

2

Ich hatte viel Glück mit Propel mit codeigniter.

+0

bitte teilen Sie den Link als Referenz – sandipshirsale

1

Sie möchten eine Bibliothek erstellen, die die ActiveRecord-Klasse erweitert.Manche Menschen sind vor Ihnen:

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

gute Mods im Thread, hier:

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

Wenn Sie suchen ORM Methoden, die für Ihre App allgemein sind, nur verlängern die ActiveRecord-Klasse. Wenn ich die Struktur einer Tabelle kenne, kann ich Formulare erstellen (automatisch generieren) und andere Zuordnungen vornehmen. Ich mache API-zu-API-Mapping, also schließe ich eine GetStructure() -Methode in MyActiveRecord ein und erstelle andere Dinge von dort.

(RoR Kichern jetzt abhauen kann)

Edit:, während ich ein Fan des Umfangs und der Macht der Lehre bin, ich denke, es ist die Nachfrage ist für Kommandozeilen-Nutzung legt sie über den Geist von CI. Was für dich richtig ist, ist das Richtige für dich, aber wenn ich Doctrine verwende, kann ich Symfony genauso gut verwenden, oder? Oder RoR, in der Tat, oder? Siehst du, wo ich mit diesem Ding klingle? Das richtige Werkzeug für die richtige Zeit.

+0

Ich stimme nicht zu, dass Doctrine zu "schwer" für CodeIgniter ist. Die "Befehlszeilenverwendung" (es muss nicht über eine Befehlszeile erfolgen - Sie können die Modellgenerierung einfach in einen CI-Controller einfügen und aus dem Web aufrufen) besteht lediglich darin, Modelldefinitionen zu generieren, die die Menge massiv reduzieren der Arbeit, die Sie in CodeIgniter tun müssen, um mit Modellen umzugehen. In meinem Geist geht es bei CI um schnelle Entwicklungsgeschwindigkeit, und Doktrin hilft dabei massiv. –

1

Ich benutzte CodeIgniter mit Propel und sie mischten sich wirklich gut. Ich habe so eine Zeit lang benutzt und ein paar Webapps auf diese Weise arbeiten lassen. Da ich ein paar schreckliche Wege gefunden habe, dies zu tun (einige beinhalteten die Änderung der Konfiguration von Apache !!). Ich habe beschlossen, einen Blogbeitrag zu veröffentlichen, wie es gemacht wird. Sie können es lesen here.

Ich hoffe, ich kann helfen!

+0

Hi @David Conde Ich habe deinen Post gelesen, kannst du mir genau sagen, was du meinst, "der beste Weg, um zu starten, ist, Propels Laufzeit in diesen Ordner zu kopieren"?Meinst du den ganzen Ordner mit Antrieb? Oder ein bestimmter Ordner? – pollux1er

3

Für zukünftige Googler, here is a tutorial Ich schrieb auf, wie CodeIgniter 2 mit Lehre 2.

Lassen Sie mich zu integrieren, wenn Sie irgendwelche Probleme haben.

2

check out GAS ORM es klingt ziemlich gut, handlich und einfach zu bedienen. einige Funktionen dieser ORM-Implementierung für CodeIgniter:

  • Unterstützte Datenbanken: CUBRID, mssql, mysql, oci8, odbc, postgre, SQLite, sqlsrv. (einschließlich PDO, wenn Sie die Synchronisierung mit CI Repo beibehalten)
  • Unterstützung mehrerer Datenbankverbindungen.
  • Unterstützung mehrerer Beziehungen.
  • Unterstützt zusammengesetzte Schlüssel (für Schlüssel, die Beziehungen definieren).
  • Automatisches Erstellen von Modellen aus Datenbanktabellen und umgekehrt.
  • Automatisches Synchronisieren von Modelltabellen durch Erstellen einer Migrationsdatei.
  • Caching pro Anfrage.
  • Selbstreferentielle und Adjazenzspalte/Daten (hierarchische Daten).
  • Eager Laden, um Ihre Beziehungsfragen (für die Leistung) zu maximieren.
  • Verschiedene Finder-Methoden (können mit den meisten CI AR verkettet werden) und Aggregate.
  • Validierung und automatische Zuordnung von Eingabesammlungen mit minimalem Setup.
  • Haken Punkte zur Kontrolle über Ihr Modell.
  • Erweiterungen für die gemeinsame Nutzung Ihrer gemeinsamen Funktion/Bibliothek in Ihrem Modell.
  • Transaktionen und andere CI AR-Güte.
  • Enthaltene phpunit-Testsuite, um den größten Teil der API-Konsistenz sicherzustellen.

gibt es ein Formular mit Funkenunterstützung -> so ist es leicht zu installieren

0

Ich denke, php-Active ist eine sehr gute Drop-in ORM. Ich habe es einige Male mit dem Slim Framework verwendet und ich denke, es wäre eine großartige Alternative zur Verwendung der nativen Modellklasse von CI. Hier ist ein Beispielcode und der Link:

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

PHP ActiveRecord

Verwandte Themen