Como: Hacer un Join de 2 tablas en Magento 2

Recientemente me enfrenté a una situación en la que necesitaba la información de una segunda tabla en mi colección y el primer pensamiento que cruzó por mi mente fue: reescribir la colección para agregar mi propia lógica, pero ... ¿Es ese realmente el enfoque correcto?

En primer lugar, reescribiendo la clase de colección principal, voy a afectar a todos los lugares en donde se use esa colección y no necesito eso, en segundo lugar, toda la idea de reescribir las cosas me parece mal, en especial, teniendo mecanismos como los observers y plugins disponibles para inyectar lógica personalizada de una manera no intrusiva, por lo que probablemente reescribir NO sea lo mejor que se puede hacer.

¿Cuál es la mejor solución entonces?

Explicaré a continuación el procedimiento que seguí para lograr esto.

Primero, creé una clase que extendiera la colección principal.

<?php

namespace Vendor\CompanyCatalog\Model\ResourceModel\Catalog\Product\Grid;

class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
{

}

Segundo, reescribí el método _initSelect () para insertar el join con mi tabla personalizada.

<?php

namespace Vendor\CompanyCatalog\Model\ResourceModel\Catalog\Product\Grid;

class Collection extends \Magento\Catalog\Model\ResourceModel\Product\Collection
{
    protected function _initSelect()
    {
        parent::_initSelect();
        $this->joinCompanyCatalogProductTable();
        return $this;
    }

    private function joinCompanyCatalogProductTable()
    {
        $this->getSelect()->joinLeft(
            ['company' => $this->getTable(\Vendor\CompanyCatalog\Setup\InstallSchema::COMPANY_CATALOG)],
            'company.product_id = e.entity_id',
            ['company_id']
        );
    }
}

Como se puede ver aquí, estoy aprovechando el método _initSelect () para unir la tabla catalog_product_entity con mi tabla personalizada.

En este momento podríais estar pensando, este tipo dijo que las reescrituras no están bien y ahora básicamente está reescribiendo el método _initSelect () de la colección principal. Sí, eso es correcto, PERO la diferencia es que no estoy creando una preferencia en el di.xml, por lo tanto, la colección base/original no va a ser reescrita, en cambio voy a decirle a mi grid que use Vendor\CompanyCatalog\Model\ResourceModel\Catalog\Product\Grid\Collection.

Espero que esto ayude.

Si tienes alguna pregunta o conoces una mejor manera de lograr esto, siéntete libre de compartir en los comentarios a continuación.

Comentarios

Siguiente Entrada Entrada Anterior