Disons que j'ai une collection comme:
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load();
Comment puis-je imprimer le code MySQL réel qui est exécuté?
Vous pouvez toujours afficher votre requête SQL à un moment donné en renvoyant getSelect comme indiqué:
$products = Mage::getModel('catalog/product')
->getCollection();
echo $products->getSelect();
Pour modifier les paramètres de requête, vous devez utiliser des méthodes telles que:
$products->addAttributeToSelect('someattribute');
$products->addAttributeToFilter('someattribute', array('eq'=>'1'));
Vous pouvez imprimer la collection en utilisant le code ci-dessous: Nous pouvons imprimer une requête de la collection en utilisant getSelect()->__toString()
$products = Mage::getModel(‘catalog/product’)
->addAttributeToFilter(‘status’, array(‘eq’ => 1));
echo $products->getSelect()->__toString();
Avez-vous vu http://kuldipchudasama.wordpress.com/2012/07/16/magento-print-query-of-collection/ ? Cela fonctionne bien.
La plupart des autres réponses ici disent que $products->getSelect()
le fera - c'est bien si tout ce que vous allez faire est echo
, mais en fait getSelect()
ne renvoie pas seulement une chaîne, il retourne un objet Varien_Db_Select.
Invoquer echo
sur cet objet déclenche automatiquement sa méthode __toString()
, vous obtenez donc simplement la chaîne SQL, mais essayez de la passer à Mage::log()
et vous obtiendrez beaucoup plus que prévu.
Si vous souhaitez simplement enregistrer le code SQL, vous pouvez utiliser:
Mage::log($products->getSelect()->__toString());
Ou que diriez-vous d'utiliser le propre de l'objet:
$products->printLogQuery(false, true); // don't echo, do log
printLogQuery
est défini dans lib/Varien/Data/Collection/Db.php.
Si vous définissez simplement le premier paramètre de ->load()
sur true
, procédez comme suit:
$products = Mage::getModel('catalog/product')
->getCollection()
...
->load(true);
Vous pouvez imprimer
$products->getSelect()->assemble();
Je travaille avec des collections tous les jours. C'est sans aucun doute la bonne façon.
echo $collection->getSelectSql(true);
Étape 1-
$result_colletion = print_r($collection->getSelect());
Mage::log($$result_colletion, null, custom_collection.log,true);
Étape 2-
Après cela, connectez-vous à la section admin de magento et activez l’enregistrement des paramètres. S'il vous plaît voir ci-dessous.
System > Configuration > Developer > Log Settings
Étape 3-
Après cela, consultez le fichier journal custom_collection.log
dans le dossier var/log/
.
Dans 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();
}
}
Et rappelez-vous que l’usine de collecte est une classe magique qui peut s’attacher à toutes les classes car Magento 1 n’était pas assez compliqué.
Essayez de suivre le code.
$products = Mage::getModel('catalog/product')
->getCollection();
echo $products->getSelect();