2011-01-13 7 views
6

Supongamos que tengo 2 tablas idénticas con la misma estructura (Llámala 'tableA' & 'tabla B').En CAKEPHP ¿podemos cambiar dinámicamente la tabla vinculada a un modelo en particular?

Quiero guardar ciertos datos en la tabla 'A' y ciertos datos en la tabla 'B'.

AHORA QUIERO usar el mismo MODELO para ambas tablas.

Quiero cambiar la tabla vinculada con el modelo (digamos 'ModelM') para cambiar dinámicamente según la condición en el controlador.

p. Ej.


En el regulador: - // código de ejemplo

function saveProduct(){ 

    $this->loadModel('ModelM'); 

    if(condition){ 

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

    }else{ 

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

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

} 

ADEMÁS DE ENERO DE 2011 El 14 de

siguiente es el copiar/pegar el código que estoy trabajando :

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

} 

Lamentablemente esto no funciona ...

Respuesta

3

puse originalmente para calcular una solución a su problema, pero cuanto más lo pienso, creo que su lógica es defectuosa.

Veo cómo el hecho de que las tablas sean similares o idénticas puede llevarlo a la decisión de usar un único modelo para interactuar con ambas tablas. Sin embargo, cuando observas lo que se supone que es un modelo (en CakePHP básicamente es una interfaz para una tabla), no tiene sentido cambiar de un lado a otro.

docs El CakePHP explican los modelos de la siguiente manera:

En la programación de un modelo de datos orientado a objetos es un objeto que representa una "cosa", como un coche, una persona, o una casa.

En su ejemplo, realmente tiene dos "cosas" separadas que se ven exactamente iguales. Por lo tanto, deberían tener sus propios modelos.

Si los modelos son realmente va a tener los mismos métodos exactos, a continuación, "la CakePHP manera" sería definir una costumbre Behavior que encapsula sus métodos compartidos. A continuación, adjunte el comportamiento a ambos modelos.

A continuación, puede cargar el modelo que necesita en la condición de control:

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

Mi problema era poco diferente, me acabo de explicar con un ejemplo ... Quiero crear una tabla aleatoria de forma dinámica (réplica exacta de una tabla existente), hacer algún cálculo complejo (avg_price) y luego copie la tabla existente a esta nueva tabla con la adición de 1 columna nueva para decir 'avg_price' ... Ahora quiero paginar esta tabla creada dinámicamente usando un 'orden por' para el campo 'avg_price' ... después de paginar dejaría caer la tabla .... – Libu

+0

Así que cada vez que ejecuto el script, se crearía una tabla-> cálculos-> copiaría la tabla anterior con el campo calculado a la nueva tabla-> paginaría la nueva tabla y establecería los datos para ver-> soltar la tabla .... – Libu

+0

¿PODEMOS CREAR LA MESA TEMPORAL EN LA MOSCA Y ASSI GN MODELO A ELLO? – Libu

0

La situación es difícil, ya que Stephen lo describe, debido a que su enfoque algo viola las convenciones MVC.

Sin embargo, si está dispuesto a ir al lado oscuro de los hacks personalizados, podría considerar crear su propio Datasource personalizado en CakePHP que maneje este tipo de lógica para usted. Una opción es extender un Datasource dado (presumiblemente el de MySQL) con su propia lógica personalizada que pretende realizar algún filtrado/acondicionamiento preliminar antes de interactuar con la base de datos.No está tan limpio porque la lógica se coloca en el ámbito equivocado, pero podría funcionar. Eche un vistazo aquí para empezar: http://book.cakephp.org/view/1075/DataSources

Como alternativa, puede crear dos modelos diferentes y hacer que compartan la misma lógica utilizando un comportamiento. Esto le limita a tomar la opción del modelo más temprano en el flujo (y por lo tanto no solo afecta la ubicación del almacenamiento de datos), sino que podría ser una posibilidad.

+0

Una fuente de datos sería interesante, ¡pero oscura de hecho! – Stephen

Cuestiones relacionadas