假设我有一个像这样的集合:
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load();
如何打印执行的实际 MySQL 代码?
您始终可以通过回显 getSelect 在某个点查看您的 sql 查询,如下所示:
$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();
如果您简单地将 to 的第一个参数设置->load()
为true
,如下所示:
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load(true);
我每天都在处理收藏品。这无疑是正确的方法。
echo $collection->getSelectSql(true);
在 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();
}
}
请记住,集合工厂是一个可以附加到每个类的魔术类,因为 Magento 1 还不够复杂。
第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/
。
试试下面的代码。
$products = Mage::getModel('catalog/product')
->getCollection();
echo $products->getSelect();