Depurar queries sql con printLogQuery en Magento2

Mytop

Un pequeño tip que muchas veces nos va a resultar útil, en particular cuando trabajemos con entidades EAV, será el poder obtener el query sql que Magento2 está armando para devolver los valores.

En Magento1, al tener la instancia de una colección, podíamos usar:

$collection->printLogQuery(true);

Y obteníamos el sql escrito, el cual, al probarlo directamente contra la base de datos, nos daba (o debía) el mismo resultado.

Ahora bien, ¿qué opciones tenemos disponibles en Magento2.

printLogQuery()

Sigue estando disponible el método y se usa de la misma forma:

$collection->printLogQuery(true);

Suponiendo que estuviera leyendo una colección de productos standard, el resultado que obtendría impreso sería:

SELECT `e`.*, `stock_status_index`.`stock_status` AS `is_salable`, `price_index`.`price`, `price_index`.`tax_class_id`, `price_index`.`final_price`, IF(price_index.tier_price IS NOT NULL, LEAST(price_index.min_price, price_index.tier_price), price_index.min_price) AS `minimal_price`, `price_index`.`min_price`, `price_index`.`max_price`, `price_index`.`tier_price` FROM `catalog_product_entity` AS `e` LEFT JOIN `cataloginventory_stock_status` AS `stock_status_index` ON e.entity_id = stock_status_index.product_id AND stock_status_index.website_id = '1' AND stock_status_index.stock_id = 1 INNER JOIN `catalog_product_index_price` AS `price_index` ON price_index.entity_id = e.entity_id AND price_index.website_id = '1' AND price_index.customer_group_id = 0

assemble()

También podemos hacer uso de assemble() una vez tomado el select().

echo $collection->getSelect()->assemble();

La diferencia aquí que debemos imprimir (o loguear) el string resultante.

Supongamos que quisiéramos obtener qué query se ejecuta para obtener los clientes que se llaman Damián.

(Claramente esto es un ejemplo burdo)

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
/** @var \Magento\Customer\Model\ResourceModel\Customer\Collection $customerCollection */
$customerCollection = $objectManager->create('Magento\Customer\Model\ResourceModel\Customer\Collection');
 
$customerCollection->addAttributeToFilter('firstname', 'damian');
$customerCollection->load();
 
echo $customerCollection->getSelect()->assemble();

La salida a obtener, en este caso, será:

SELECT `e`.* FROM `customer_entity` AS `e` WHERE (`e`.`firstname` = 'damian')