次のようなコレクションがあるとします。
$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();
私は毎日コレクションを扱っています。これは間違いなく正しい方法です。
echo $collection->getSelectSql(true);
次のように、の最初のパラメータを単純に->load()
toに設定すると、次のtrue
ようになります。
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load(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 が十分に複雑ではないため、すべてのクラスにアタッチできる魔法のクラスであることを思い出してください。
次のコードを試してください。
$products = Mage::getModel('catalog/product')
->getCollection();
echo $products->getSelect();