zend tutorial mac how framework español php zend-framework

php - tutorial - Unir tablas automáticamente sin romper el comportamiento predeterminado en Zend Framework



zend framework tutorial (3)

La situación es la siguiente: tengo 2 modelos: ''Acción'' y ''Usuario''. Estos modelos se refieren a las tablas ''acciones'' y ''usuarios'', respectivamente.

Mi tabla de acciones contiene una columna user_id . En este momento, necesito una descripción general de todas las acciones y los usuarios a los que están asignados. Cuando uso $action->fetchAll() , solo tengo la ID de usuario, por lo que deseo poder unir los datos del modelo de usuario, preferiblemente sin hacer una llamada a findDependentRowset() .

Pensé en crear fetchAll() , fetchRow() y find() en mi modelo, pero esto rompería el comportamiento predeterminado.

¿Cuál es la mejor manera de resolver este problema? Cualquier ayuda sería muy apreciada.


Siempre puede hacer una vista en su base de datos que haga la unión por usted.

CREATE OR REPLACE VIEW VwAction AS SELECT [columns] FROM action LEFT JOIN user ON user.id = action.user_id

Entonces solo usa

$vwAction->fetchAll();

Solo recuerde que las vistas en MySQL son de solo lectura (asumiendo que esto es MySQL)


Diseñé e implementé la función de relaciones de tabla en Zend Framework.

Mi primer comentario es que no usaría findDependentRowset() todos modos, usaría findParentRow() si la acción tiene una referencia de clave externa al usuario.

$actionTable = new Action(); $actionRowset = $actionTable->fetchAll(); foreach ($actionRowset as $actionRow) { $userRow = $actionRow->findParentRow(''User''); }

Editar: en el ciclo, ahora tiene un objeto $ actionRow y un objeto $ userRow. Puede escribir cambios en la base de datos a través de cualquier objeto cambiando los campos de objeto y llamando a save() en el objeto.

También puede usar la clase Zend_Db_Table_Select (que se implementó después de abandonar el proyecto) para recuperar un Rowset basado en una unión entre Acción y Usuario.

$actionTable = new Action(); $actionQuery = $actionTable->select() ->setIntegrityCheck(false) // allows joins ->from($actionTable) ->join(''user'', ''user.id = action.user_id''); $joinedRowset = $actionTable->fetchAll($actionQuery); foreach ($joinedRowset as $joinedRow) { print_r($joinedRow->toArray()); }

Tenga en cuenta que dicho conjunto de filas basado en una consulta de combinación es de solo lectura. No puede establecer valores de campo en los objetos de Fila y llamar a save() para publicar cambios en la base de datos.

Editar: no hay forma de que se pueda escribir un conjunto arbitrario de resultados unidos. Considere un ejemplo simple basado en el conjunto de resultados adjunto arriba:

action_id action_type user_id user_name 1 Buy 1 Bill 2 Sell 1 Bill 3 Buy 2 Aron 4 Sell 2 Aron

A continuación, para la fila con action_id = 1, modifico uno de los campos que provienen del objeto Usuario:

$joinedRow->user_name = ''William''; $joinedRow->save();

Preguntas: cuando veo la siguiente fila con action_id = 2, ¿debería ver ''Bill'' o ''William''? Si es ''William'', ¿significa esto que la fila de guardado 1 tiene que actualizar automáticamente ''Bill'' a ''William'' en todas las demás filas de este conjunto de resultados? ¿O significa que save() vuelve a ejecutar automáticamente la consulta SQL para obtener un conjunto de resultados actualizado de la base de datos? ¿Qué sucede si la consulta lleva mucho tiempo?

También considere el diseño orientado a objetos. Cada fila es un objeto separado. ¿Es apropiado que llamar a save() en un objeto tenga el efecto secundario de cambiar valores en un objeto separado (incluso si son parte de la misma colección de objetos)? Parece una forma de acoplamiento de contenido para mí.

El ejemplo anterior es una consulta relativamente simple, pero también se permiten consultas mucho más complejas. Zend_Db no puede analizar consultas con la intención de decir resultados modificables a partir de resultados de solo lectura. Es por eso que las vistas de MySQL no son actualizables.


¿No está creando una tabla de vista sql una buena solución para hacer joint? y después de una clase de tabla simple para acceder a ella

Creo que es mejor si tu lógica está en sql que en php