如何在magento中打印集合mysql查询

Luc*_*one 12 debugging magento

假设我有一个类似的集合:

$products = Mage::getModel('catalog/product')
            ->getCollection()
            ...
            ->load();
Run Code Online (Sandbox Code Playgroud)

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

小智 20

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

$products = Mage::getModel('catalog/product')
        ->getCollection();
echo $products->getSelect();
Run Code Online (Sandbox Code Playgroud)

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

$products->addAttributeToSelect('someattribute');
$products->addAttributeToFilter('someattribute', array('eq'=>'1'));
Run Code Online (Sandbox Code Playgroud)


小智 13

您可以使用以下代码打印集合:我们可以使用打印集合的查询 getSelect()->__toString()

$products = Mage::getModel(‘catalog/product’)
 ->addAttributeToFilter(‘status’, array(‘eq’ => 1));
echo $products->getSelect()->__toString();
Run Code Online (Sandbox Code Playgroud)

你看过http://kuldipchudasama.wordpress.com/2012/07/16/magento-print-query-of-collection/吗?这很好用.


Dou*_*ean 6

这里的大多数其他答案都表示$products->getSelect()会这样做 - 如果您要处理它的话,这很好echo,但事实上getSelect()它并不只是返回一个字符串,而是返回一个Varien_Db_Select对象.

调用echo该对象会自动触发其__toString()方法,因此您只需获取SQL字符串,但尝试将其传递给Mage::log()您,您将获得比预期更多的内容.

如果您只想记录SQL,可以使用:

Mage::log($products->getSelect()->__toString());
Run Code Online (Sandbox Code Playgroud)

或者如何使用对象自己:

$products->printLogQuery(false, true); // don't echo, do log
Run Code Online (Sandbox Code Playgroud)

printLogQuery 在lib/Varien/Data/Collection/Db.php中定义.