13

假设我有一个像这样的集合:

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ...
            ->load();

如何打印执行的实际 MySQL 代码?

4

9 回答 9

21

您始终可以通过回显 getSelect 在某个点查看您的 sql 查询,如下所示:

$products = Mage::getModel('catalog/product')
        ->getCollection();
echo $products->getSelect();

要更改查询参数,您需要查看以下方法:

$products->addAttributeToSelect('someattribute');
$products->addAttributeToFilter('someattribute', array('eq'=>'1'));
于 2012-04-04T19:19:28.977 回答
13

您可以使用以下代码打印集合:我们可以使用打印集合查询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/吗?这很好用。

于 2012-08-29T05:22:40.873 回答
7

这里的大多数其他答案都说$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 中定义。

于 2014-12-09T09:12:28.127 回答
3

你可以打印

$products->getSelect()->assemble();
于 2012-04-04T16:35:35.793 回答
2

如果您简单地将 to 的第一个参数设置->load()true,如下所示:

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ...
           ->load(true);
于 2015-03-17T17:46:49.597 回答
2

我每天都在处理收藏品。这无疑是正确的方法。

echo $collection->getSelectSql(true);

于 2016-05-15T07:09:07.090 回答
1

在 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 还不够复杂。

于 2016-05-15T04:54:32.517 回答
0

第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/

于 2015-05-28T17:21:11.283 回答
0

试试下面的代码。

 $products = Mage::getModel('catalog/product')
                ->getCollection();

    echo $products->getSelect();
于 2016-05-16T05:14:25.070 回答