2011-01-13 8 views
6

Supponiamo di avere 2 tabelle identiche aventi la stessa struttura (chiamiamolo 'tableA' & 'tableB').In CAKEPHP possiamo cambiare dinamicamente la tabella collegata ad un particolare modello?

Desidero salvare determinati dati sulla tabella 'A' e alcuni dati sulla tabella 'B'.

ORA Desidero utilizzare lo stesso MODELLO per entrambi i tavoli.

Desidero modificare la tabella collegata al modello (ad esempio "ModelM") per modificare dinamicamente in base alle condizioni del controller.

ad es.


In regolatore: - // codice di esempio

function saveProduct(){ 

    $this->loadModel('ModelM'); 

    if(condition){ 

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

    }else{ 

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

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

} 

AGGIUNTA SU 14 Gennaio 2011

seguito è il copia/incolla del codice che sto lavorando su :

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

} 

Purtroppo questo non funziona ...

risposta

3

All'inizio ho deciso di capire una soluzione al tuo problema, ma più ci penso, credo che la tua logica è viziata.

Posso vedere come il fatto che le tabelle siano simili o identiche può portare alla decisione di utilizzare un singolo modello per interagire con entrambe le tabelle. Tuttavia, quando si guarda a ciò che un modello dovrebbe essere (in CakePHP fondamentalmente un'interfaccia per un tavolo), non ha senso passare avanti e indietro.

Il CakePHP docs spiegano modelli come questo:

In programmazione orientata agli oggetti un modello di dati è un oggetto che rappresenta una "cosa", come una macchina, una persona, o una casa.

Nel tuo esempio, hai davvero due "cose" separate che sembrano esattamente le stesse. Pertanto, dovrebbero avere i propri modelli.

Se i modelli sono davvero andando ad avere gli stessi metodi esatti, poi "la Via CakePHP" sarebbe per definire una consuetudine Behavior che incapsula i vostri metodi condivisi. Quindi allega il comportamento a entrambi i modelli.

Quindi è possibile caricare il modello che avete bisogno nella condizione Controller:

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

Il mio problema era po 'diverso, ho appena spiegato, dando un esempio ... voglio creare una tabella casuale in modo dinamico (replica esatta di una tabella esistente), fare qualche calcolo complesso (avg_price) e quindi copia la tabella esistente in questa nuova tabella con l'aggiunta di 1 nuova colonna per dire "avg_price" ... Ora voglio impaginare questa tabella creata dinamicamente usando un campo "ordina per" al campo "avg_price" ... dopo aver impaginato avrei lasciato cadere la tabella .... – Libu

+0

Quindi ogni volta che eseguo lo script, viene creata una tabella-> calcoli-> copia la vecchia tabella con il campo calcolato nella nuova tabella-> impagina la nuova tabella e imposta i dati per visualizzare-> rilasciare la tabella .... – Libu

+0

POSSIAMO CREARE TABELLA TEMPORANEA SUL FLY E ASSI MODELLO GN PER ESSO ?? – Libu

0

La situazione è difficile, come Stephen descrive, perché il tuo approccio viola in qualche modo le convenzioni MVC.

Tuttavia, se sei disposto ad andare al lato oscuro degli hack personalizzati, potresti prendere in considerazione la creazione di una propria origine dati personalizzata in CakePHP che gestisce questo tipo di logica per te. Un'opzione è di estendere una data sorgente dati (presumibilmente quella MySQL) con la tua logica personalizzata che mira a eseguire alcuni filtri/condizionamenti preliminari prima di interagire con il database.Non è pulito perché la logica è inserita nella portata sbagliata, ma potrebbe funzionare. Date un'occhiata qui per cominciare: http://book.cakephp.org/view/1075/DataSources

In alternativa, è possibile creare due diversi modelli e farli condividere la stessa logica utilizzando un comportamento. Questo ti limita a prendere la scelta del modello prima nel flusso (e quindi non influenza solo la posizione della memorizzazione dei dati), ma potrebbe essere una possibilità.

+0

Un'origine dati sarebbe interessante, ma in realtà è il lato oscuro! – Stephen