Pregunta

Estoy trabajando en una aplicación desarrollada con Zend Framework. He definido relaciones en modelos y puedo usarlas felizmente, por ejemplo:

$rowset = $row->findManyToManyRowset('People', 'Jobs');

Sin embargo, he encontrado un problema en el que se devuelve el conjunto de filas con nombres de columna que son los mismos en 'Personas' y 'Trabajos' y, por lo tanto, combina las claves de la matriz, perdiendo algunos de los datos del conjunto de filas final.

Entiendo que puedo pasar un objeto Zend_Db_Select a findManyToManyRowset () como uno de los parámetros, pero no puedo encontrar ninguna documentación que explique cómo usarlo en este caso , por ejemplo:

$select = $this->select()->from(array(
                                     'p' => 'people', 
                                     'j' => 'jobs'
                                     ),
                                array( 
                                     'person_id' => 'p.id',
                                     'job_id' => 'j.id',
                                     'person_code' => 'p.code',
                                     'job_code' => 'j.code'
                                     )
                                );  

Si trato de usar el código anterior, recibo un mensaje como:

Error: No reference rule "" from table People to table Jobs

¿Puede alguien aclararme cómo se debe hacer esto? Sé que podría cambiar los nombres de mis columnas en la base de datos, pero preferiría un cambio de código en lugar de rediseñar mi estructura de base de datos y actualizar todo el código relacionado.

Nota: sin alguna forma de alias de columna como el anterior, el conjunto de filas devuelto se ve así (es decir, combina las columnas con los mismos nombres):

[_data:protected] => Array
    (
        [id] => 1
        [code] => SX342
    )

Saludos,
  Matt

¿Fue útil?

Solución

Mi primera recomendación es que no debe nombrar columnas como nombres genéricos como id y code . Estos nombres no tienen sentido y, como ha descubierto, también provocan colisiones cuando obtiene resultados en una matriz asociativa.

También está utilizando la interfaz Seleccionar incorrectamente. Debe especificar solo una tabla por from () call o join () call.

Finalmente, nunca trato de hacer consultas complejas a través de la interfaz de relaciones Zend_Db_Table . Está destinado solo para casos simples. Si tiene una consulta más compleja, simplemente escriba la consulta SQL explícitamente.

Consulte también Cómo hacer una consulta unida en la interfaz de tablas ZF?

Otros consejos

Sé que esta respuesta llega un poco tarde, pero aquí hay algunas cosas que señalar.

1) findManyToManyRowset ($ matchTable, $ intersectionTable, $ callerRefRule, $ matchRefRule, $ select); - si está pasando un Zend_Db_Table_Select va a querer pasar null para las reglas.

2) El Zend_Db_Table_Select pasado al findManyToManyRowset () debe crearse a partir de $ matchTable y es seguro asumir que en el lugar donde Las cláusulas i es el alias de la tabla de intersección, y m es el alias de la tabla de coincidencias.

3) En el caso de colisiones, m ganará el nombre de la clave en la matriz asociativa devuelta en php. La consulta ejecutada se ve así:

  SELECT 
    `i`.*, `m`.* 
  FROM 
    `interscetTable` AS `i` 
  INNER JOIN 
    `matchTable` AS `m` 
  ON
    `i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?)  

4) Pase lo que pase, el valor de retorno de findManyToManyRowset () será un Rowset creado a partir de $ matchTable , por lo tanto, si necesita capturar cualquier información del tabla de intersección, mientras que también captura los datos para la tabla de coincidencias, probablemente necesitará tener un Zend_Db_Select personalizado y evitar usar el material Zend_Db_Table para asignar los datos de todos modos.

Entonces, un ejemplo de trabajo, usando "Personas" como la tabla de coincidencias, "Trabajadores" como la tabla de intersección y digamos " Clientes " como la tabla de origen. Suponiendo para este ejemplo que las tablas enlazan algo como:  Personas. id: ... - > trabajadores. person_id: client_id: job_id - > clientes: id: ...

$client = $clientTable->fetchRow(); /// grab a random client

// fetch all people that have worked for the client ordered by their last name.
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('m.lastname')); 

// fetch all people that have worked for the client ordered by their hire date:
// `workers`.`hiredate`
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('i.hiredate')); 
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top