Relacionar tablas en Collections del UI component
Cuando creamos un ui component del tipo listing, necesitamos especificarle un dataprovider. Este dataprovider proveerá datos al listing. En la clase 'dataprovider', está una propiedad 'collection', que contiene un listado de datos una o varias tablas. Es importante poner un id diferenciador en el tag requestFieldName si el id es ambiguo para 2 o más tablas.
entity_id Vendor_Module::resource id entity_id
Cuando queremos unir 2 tablas, sobreescribimos el método _initSelect de la clase Collection. y escribimos lo siguiente:
protected function _initSelect() { parent::_initSelect(); $this->getSelect()->join( ['alias de la tabla' => $this->table('tabla_secundaria')], tabla_main.id = tabla_secundaria.id, [ campos a sacar, si queremos darle alias a algún campo porque es ambiguo usamos lo siguiente 'alias' => 'nombre_tabla.campo' ] ); } //Ojo! si ponemos alias a los campos necesitamos mapear el filter, sino no funcionará la funcionalidad de la búsqueda $this->addFilterToMap('nombre del elemento filtrado', 'valor para ese filtro, un campo de la table por ej: main_table.campo')Si queremos usar subqueries, por ejemplo usar un subquery dentro de un SELECT Statement. Se hace de la siguiente manera:
Usamos el método columns para espeficar campos
$this->getSelect()->join( ['alias de la tabla' => $this->table('tabla_secundaria')], tabla_main.id = tabla_secundaria.id, [ campos a sacar, si queremos darle alias a algún campo porque es ambiguo usamos lo siguiente 'alias' => 'nombre_tabla.campo' ] ->columns([ 'alias de otra tabla' => new \Zend_Db_Expre('SELECT * FROM otratabla WHERE otratablaid = estatablaid') ]) );Ojo la línea del código del new \Zend.. puede ser sustituido por el siguiente código
$this->getConnection()->select()->from('unatabla')->reset ...etcSi queremos ver la sentencia del collection usamos el siguiente método:
$collection->getSelect()->__toString()