Скажем, у меня есть коллекция вроде:
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load();
Как распечатать фактический код MySQL, который выполняется?
Скажем, у меня есть коллекция вроде:
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load();
Как распечатать фактический код MySQL, который выполняется?
Вы всегда можете просмотреть свой SQL-запрос в определенной точке, повторив getSelect, как показано:
$products = Mage::getModel('catalog/product')
->getCollection();
echo $products->getSelect();
Чтобы изменить параметры запроса, вы хотите проверить методы, например:
$products->addAttributeToSelect('someattribute');
$products->addAttributeToFilter('someattribute', array('eq'=>'1'));
Вы можете распечатать коллекцию, используя следующий код:
Мы можем распечатать запрос коллекции с помощью getSelect()->__toString()
$products = Mage::getModel(‘catalog/product’)
->addAttributeToFilter(‘status’, array(‘eq’ => 1));
echo $products->getSelect()->__toString();
Вы видели http://kuldipchudasama.wordpress.com/2012/07/16/magento-print-query-of-collection/? Это хорошо работает.
В большинстве других ответов здесь говорится, что $products->getSelect()
сделает это - это прекрасно, если все, что вы собираетесь с ним делать, - это echo
, но на самом деле getSelect()
не просто возвращает строку, она возвращает объект Varien_Db_Select.
Вызов echo
на этом объекте автоматически запускает свой метод __toString()
, поэтому вы просто получите строку SQL, но попробуйте передать его на Mage::log()
, и вы получите намного больше, чем вы ожидали.
Если вы просто хотите зарегистрировать SQL, вы можете использовать:
Mage::log($products->getSelect()->__toString());
Или как об использовании собственного объекта:
$products->printLogQuery(false, true); // don't echo, do log
printLogQuery
определяется в lib/Varien/Data/Collection/Db.php.
Вы можете распечатать
$products->getSelect()->assemble();
Если вы просто установите первый параметр ->load()
в true
, например:
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load(true);
Я работаю с коллекциями каждый день. Это, без сомнения, правильный путь.
echo $collection->getSelectSql(true);
Шаг 1-
$result_colletion = print_r($collection->getSelect());
Mage::log($$result_colletion, null, custom_collection.log,true);
Шаг 2-
После этого войдите в раздел администратора magento и включите запись в журнал. См. Ниже.
System > Configuration > Developer > Log Settings
Шаг 3 -
После этого см. файл журнала custom_collection.log
в папке var/log/
.
В Magento 2: -
namespace <Company>\<Module>\Block\Adminhtml\Tab\Log;
class Grid
extends \Magento\Backend\Block\Widget\Grid\Extended
{
protected $_collectionFactory;
/**
* Constructor
*
* @param \Magento\Backend\Block\Template\Context $context
* @param \Magento\Backend\Helper\Data $backendHelper
* @param \<Company>\<Module>\Model\ResourceModel\Log\CollectionFactory $collectionFactory
* @param Psr\Log\LoggerInterface $logger
* @param array $data
*/
public function __construct(
\Magento\Backend\Block\Template\Context $context,
\<Company>\<Module>\Model\ResourceModel\Log\CollectionFactory $collectionFactory,
\Psr\Log\LoggerInterface $logger,
array $data = []
) {
$this->_logger = $logger;
$this->_collectionFactory = $collectionFactory;
parent::__construct($context, $backendHelper, $data);
}
/**
* {@inheritdoc}
*/
protected function _prepareCollection()
{
$collection = $this->_collectionFactory->create();
$this->_logger->info($collection->getSelect()->__toString());
$this->setCollection($collection);
return parent::_prepareCollection();
}
}
И помните, что коллекция factory является магическим классом, который может присоединяться к каждому классу, поскольку Magento 1 не был достаточно сложным.
Попробуйте использовать следующий код.
$products = Mage::getModel('catalog/product')
->getCollection();
echo $products->getSelect();
SELECT e
. entity_id
IF (at_name.value_id > 0, at_name.value, at_name_default.value) AS name
,
pcategory_name.value AS 'PCat',
eaov.value AS 'brand',
stoke.stock_status AS 'inStoke',
pcategory_name.entity_id AS 'cat_id',
ccei.`value` AS 'is_active'
ОТ catalog_product_entity
AS e
ВНУТРЕННЕЕ СОЕДИНЕНИЕ catalog_product_entity_varchar
AS at_name_default
ON (at_name_default
. entity_id
= e
. entity_id
) И (at_name_default
. attribute_id
= (SELECT attribute_id FROM eav_attribute
ea LEFT JOIN eav_entity_type
et ON ea.entity_type_id = et.entity_type_id WHERE ea
. attribute_code
= 'name' AND et.entity_type_code = 'catalog_product ')) А ТАКЖЕ at_name_default
. store_id
= 0 ВЛЕВО catalog_product_entity_varchar
AS at_name
ON (at_name
. entity_id
= e
. entity_id
) И (at_name
. attribute_id
= (SELECT attribute_id FROM eav_attribute
ea LEFT JOIN eav_entity_type
et ON ea.entity_type_id = et.entity_type_id WHERE ea
. attribute_code
= 'name' AND et.entity_type_code = 'catalog_product ')) А ТАКЖЕ (at_name
. store_id
= 1) ВЛЕВО cataloginventory_stock_status
AS stoke
ON (stoke
. product_id
= e
. entity_id
)
LEFT JOIN
`catalog_product_entity_varchar` AS `key`
ON (`key`.`entity_id` = `e`.`entity_id`)
AND key.attribute_id = 160
INNER JOIN catalog_category_entity
AS pcategory
ON pcategory.entity_id = (SELECT MAX (category_id) FROM catalog_category_product WHERE product_id = e.entity_id AND category_id!= 2)
ВХОДЯЩИЙ ПРИСОЕДИНЕНИЕ catalog_category_entity_int
AS ccei ON ccei. entity_id
= pcategory. entity_id
И ccei. attribute_id
= 34
LEFT JOIN `catalog_category_entity_varchar` AS `pcategory_name` ON pcategory_name.entity_id = pcategory.entity_id AND pcategory_name.attribute_id = 33
LEFT JOIN catalog_product_entity_int
AS cpei
ON cpei. entity_id
= e
. entity_id
И cpei.entity_type_id = 4 И cpei.attribute_id = 70
LEFT JOIN catalog_product_entity_int
AS cpeis
ON cpeis. entity_id
= e
. entity_id
AND cpeis.attribute_id = 155
LEFT JOIN eav_attribute_option_value AS `eaov` ON eaov.option_id = cpei.value
WHERE ccei.`value`=1 AND pcategory.parent_id=2