zend framework database zend-framework2 resultset

database - zend framework 2 sql between



Recuperando todos los campos de una fila de la base de datos como objeto en zend framework 2 (1)

Sé que tenemos un conjunto de resultados para obtener una fila como objeto. Pero, ¿cómo puedo obtener cada campo como un objeto separado? considere esta fila de base de datos:

user_id address_id product_id shop_id 5 3 134 2

Quiero recuperar y guardar la fila de la siguiente manera:

userEntity AddressEntity ProductEntity ShopEntity


Esta no es la TableDataGateway se supone que TableDataGateway se utilizará, ya que lo que está buscando son características más complejas como las de Doctrine 2 ORM y mapeadores de datos similares.

Aquí hay una posible solución al problema, que implica el uso de un hidratador personalizado ( documentos ). Mi ejemplo está simplificado, pero espero que aclare cómo debe construir su conjunto de resultados.

Primero, defina sus entidades (simplifico el ejemplo suponiendo que UserEntity es la raíz de su hidratación):

class UserEntity { /* fields public for simplicity of the example */ public $address; public $product; public $shop; } class AddressEntity { /* add public fields here for simplicity */ } class ProductEntity { /* add public fields here for simplicity */ } class ShopEntity { /* add public fields here for simplicity */ }

Luego, crea hidratantes específicos para las entidades individuales:

use Zend/Stdlib/Hydrator/HydratorInterface as Hydrator; class AddressHydrator implements Hydrator { // @TODO: implementation up to you } class ProductHydrator implements Hydrator { // @TODO: implementation up to you } class ShopHydrator implements Hydrator { // @TODO: implementation up to you }

Luego agregamos estos hidratantes en uno que está específicamente diseñado para hidratar una UserEntity :

class UserHydrator extends /Zend/Stdlib/Hydrator/ObjectProperty { public function __construct( Hydrator $addressHydrator, Hydrator $productHydrator, Hydrator $shopHydrator ) { $this->addressHydrator = $addressHydrator; $this->productHydrator = $productHydrator; $this->shopHydrator = $shopHydrator; } public function hydrate(array $data, $object) { if (isset($data[''address_id''])) { $data[''address''] = $this->addressHydrator->hydrate($data, new AddressEntity()); } if (isset($data[''product_id''])) { $data[''product''] = $this->productHydrator->hydrate($data, new ProductEntity()); } if (isset($data[''shop_id''])) { $data[''shop''] = $this->shopHydrator->hydrate($data, new ShopEntity()); } return parent::hydrate($data, $object); } }

Ahora puede usarlo para trabajar con su conjunto de resultados. Definamos el servicio para su UserEntityTableGateway :

''UserEntityTableGateway'' => function ($sm) { $dbAdapter = $sm->get(''Zend/Db/Adapter/Adapter''); $resultSetPrototype = new ResultSet(); $resultSetPrototype->setArrayObjectPrototype(new UserHydrator()); return new TableGateway(''user'', $dbAdapter, null, $resultSetPrototype); },

Todos estos son ejemplos simplificados, pero deberían ayudarlo a comprender cuán poderosos pueden ser los hidratantes y cómo puede componerlos para resolver problemas complejos.

También puede consultar los capítulos de la documentación sobre el agregado de hidratación y las estrategias de hidratación , que fueron diseñados específicamente para resolver su problema.