web-dev-qa-db-fra.com

Comment imprimer une requête mysql de collection dans magento

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é?

11
Luca Borrione

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'));
20
Nick McCormack

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.

12
Kul

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.

5
Doug McLean

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);
2
wesleywmd

Vous pouvez imprimer

$products->getSelect()->assemble();
2
Luca Borrione

Je travaille avec des collections tous les jours. C'est sans aucun doute la bonne façon.

echo $collection->getSelectSql(true);

2
Shawn Abramson

É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/.

0
P. Prakash

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é. 

0
Dallas Clarke

Essayez de suivre le code. 

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

    echo $products->getSelect();
0
Sagar U