2011-01-13 10 views
6

Angenommen, ich habe 2 identische Tabellen mit derselben Struktur (nennen Sie es 'tableA' & 'tableB').In CAKEPPP können wir die Tabelle, die mit einem bestimmten Modell verknüpft ist, dynamisch ändern?

Ich möchte bestimmte Daten in Tabelle 'A' und bestimmte Daten in Tabelle 'B' speichern.

JETZT möchte ich das gleiche MODELL für die Tabelle verwenden.

Ich möchte die mit dem Modell verknüpfte Tabelle (z. B. "ModelM") ändern, um sie basierend auf dem Zustand am Controller dynamisch zu ändern.

z.B.


In Reglern: - // Beispielcode

function saveProduct(){ 

    $this->loadModel('ModelM'); 

    if(condition){ 

     $this->ModelM->useTable = 'A'; 

    }else{ 

     $this->ModelM->useTable = 'B'; 

    } 
    $this->ModelM->save($this->data); 

} 

ADDITION ON 14. Januar 2011

Es folgt das Kopieren/Einfügen von Code Ich arbeite an :

function experiment(){ 

    $tableName = 'temp_table'.'1234'; 

    mysql_query('CREATE TABLE '.$tableName.' LIKE temp_home_masters'); 

    $sql = $this->createInsertQuery($new_arr,$tableName); 

    $status = mysql_query($sql); 

    if($status){ 
     echo "saved successfully"; 
    }else{ 
     echo "error"; 
    } 

    $this->NewHomeMaster->setSource($tableName);//NewHomeMaster was previously attached to a different table , here I want to change the tableName the model linked with dynamically.Model 'NewHomeMaster' already exists and uses a table ...Here I am willing to link this model to the newly created tempory table.// 

    $home_details=$this->paginate('NewHomeMaster',array($new_conditions)); 

    mysql_query('DROP table '.$tableName); 

} 

LEIDER funktioniert das nicht ...

Antwort

3

ich ursprünglich dargelegt, um eine Lösung für Ihr Problem Figur, aber je mehr ich darüber nachdenke, glaube ich Ihre Logik fehlerhaft ist.

Ich kann sehen, wie die Tatsache, dass die Tabellen ähnlich oder identisch sind, Sie zu der Entscheidung führen können, ein einzelnes Modell zu verwenden, um mit beiden Tabellen zu interagieren. Betrachtet man jedoch, was ein Modell sein soll (In CakePHP im Grunde eine Schnittstelle zu einer Tabelle), macht es keinen Sinn, hin und her zu wechseln.

Die CakePHP docs erklären Modelle wie folgt aus:

In der objektorientierten Programmierung ein Datenmodell ist ein Objekt, das ein „Ding“, wie ein Auto darstellt, eine Person oder ein Haus.

In Ihrem Beispiel haben Sie wirklich zwei separate "Dinge", die genau gleich aussehen. Daher sollten sie ihre eigenen Modelle haben.

Wenn Ihre Modelle sind wirklich genau die gleichen Methoden haben, gehen, dann „die CakePHP Way“ wäre eine benutzerdefinierte Behavior zu definieren, die gemeinsam genutzten Methoden kapselt. Hängen Sie das Verhalten dann an beide Modelle an.

Dann können Sie das Modell, das Sie im Controller-Zustand müssen laden:

private $DynamicModel; 

public function saveProduct() { 
    if (condition) { 
     App::import('Model', 'ModelZ'); 
     $this->DynamicModel = new ModelZ; 
    } else { 
     App::import('Model', 'ModelY'); 
     $this->DynamicModel = new ModelY; 
    } 
    $this->DynamicModel->save($this->data); 
} 
+0

Mein Problem etwas anders war, erklärte ich es nur durch ein Beispiel zu geben ... Ich möchte dynamisch eine Zufalls Tabelle erstellen (exakte Kopie einer bestehenden Tabelle), eine komplexe Berechnung machen (avg_price) und kopiere dann die existierende Tabelle in diese neue Tabelle mit der Hinzufügung von 1 neuen Spalte zu 'avg_price' ... Nun möchte ich diese dynamisch erzeugte Tabelle paginieren, indem ich 'Order by' zum Feld 'avg_price' benutze ... nach dem paginieren würde ich die Tabelle fallen lassen ... – Libu

+0

Also jedes Mal, wenn ich das Skript ausführen würde eine Tabelle erstellt werden-> Berechnungen-> kopieren Sie die alte Tabelle mit berechneten Feld in die neue Tabelle-> paginieren die neue Tabelle und legen Sie die Daten zu sehen-> drop the table .... – Libu

+0

KÖNNEN wir temporäre Tabelle auf der FLY und ASSI erstellen GN MODELL ZU IT ?? – Libu

0

Die Situation heikel ist, wie Stephen es beschreibt, weil Ihr Ansatz etwas die MVC-Konventionen verstößt.

Wenn Sie jedoch bereit sind, auf die dunkle Seite von benutzerdefinierten Hacks zu gehen, können Sie in CakePHP Ihre eigene angepasste Datenquelle erstellen, die diese Art von Logik für Sie verarbeitet. Eine Option besteht darin, eine bestimmte Datenquelle (vermutlich die MySQL-Datenbank) mit Ihrer eigenen benutzerdefinierten Logik zu erweitern, die darauf abzielt, vor der Interaktion mit der Datenbank eine vorbereitende Filterung/Konditionierung durchzuführen.Nicht so sauber, weil die Logik im falschen Bereich liegt, aber könnte funktionieren. Werfen Sie einen Blick hier für einen Anfang: http://book.cakephp.org/view/1075/DataSources

Alternativ können Sie zwei verschiedene Modelle erstellen und sie die gleiche Logik mit einem Verhalten teilen. Dies begrenzt Sie, die Wahl des Modells früher in den Fluss zu nehmen (und betrifft somit nicht nur den Speicherort des Datenspeichers), sondern könnte eine Möglichkeit sein.

+0

Eine Datenquelle wäre interessant, aber in der Tat dunkel! – Stephen