web-dev-qa-db-fra.com

La requête SQL brute renvoie plusieurs lignes, mais avec les méthodes Joomla, une seule ligne est renvoyée

Pour une raison quelconque, la requête que j'ai placée directement dans DB fonctionne, mais lorsqu'elle est définie dans la syntaxe Joomla, elle ne renvoie qu'un seul résultat, et il devrait y en avoir beaucoup plus ...

Effacer la requête Mysql:

SELECT 
vmp.virtuemart_product_id as 'product_id',
vmp.product_parent_id as 'parent_id',
vmp.product_sku as 'sku',
vmp.product_in_stock as 'stock',
vmp.published as 'published',
pc.virtuemart_category_id as "category"
FROM `mus_virtuemart_products` as vmp
JOIN mus_virtuemart_product_categories as pc ON pc.virtuemart_product_id=vmp.product_parent_id
WHERE vmp.product_parent_id>0 AND pc.virtuemart_category_id=105;

requête Joomly:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(array(
                    'vmp.virtuemart_product_id as product_id',
                    'vmp.product_parent_id as parent_id',
                    'vmp.product_sku as sku',
                    'vmp.product_in_stock as stock',
                    'vmp.published as published',
                    'pc.virtuemart_category_id as category'
                    ))
      ->from($db->quoteName('#__virtuemart_products','vmp'))
      ->join('INNER', $db->quoteName('#__virtuemart_product_categories','pc') . 
        ' ON (' . $db->quoteName('pc.virtuemart_product_id') . ' = ' . $db->quoteName('vmp.virtuemart_product_id') . ')')        
      ->where($db->quoteName('pc.virtuemart_category_id') . ' = '. $db->quote($category). ' AND '. $db->quoteName('vmp.product_parent_id') . ' >0');
$db->setQuery($query);
$podaci = $db->loadAssocList();

J'ai essayé différentes combinaisons et je n'obtiens toujours qu'un seul résultat. Je pense que j'ai limité le problème à 1 condition dans la clause WHERE:

->where($db->quoteName('vmp.product_parent_id') . ' >0');  

J'ai essayé de mettre "zéro" comme $db->quote($zero)$zero="0", Mais je n'ai rien changé.


MISE À JOUR 1

Après quelques itérations dans mon code, je commence à obtenir une erreur:

Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à la version de votre serveur MariaDB pour la bonne syntaxe à utiliser près de '' à la ligne 3

Quand je change ma condition where en seulement $db->quoteName('pc.virtuemart_category_id') . ' = '. $db->quote($category) la requête fonctionne bien.

1
Oktarin

J'ai trouvé l'erreur dans ma requête.

Original:

JOIN mus_virtuemart_product_categories as pc ON pc.virtuemart_product_id=vmp.product_parent_id

Requête Joomla:

->join('INNER', $db->quoteName('#__virtuemart_product_categories','pc') . 
    ' ON (' . $db->quoteName('pc.virtuemart_product_id') . ' = ' . $db->quoteName('vmp.virtuemart_product_id') . ')')
  • La dernière référence de colonne doit être remplacée.

Au lieu de vmp.virtuemart_product_id ça devrait être vmp.product_parent_id

La dernière requête correcte est donc:

$db = JFactory::getDbo();
$query = $db->getQuery(true);
$query->select(array(
                    'vmp.virtuemart_product_id as product_id',
                    'vmp.product_parent_id as parent_id',
                    'vmp.product_sku as sku',
                    'vmp.product_in_stock as stock',
                    'vmp.published as published',
                    'pc.virtuemart_category_id as category'
                    ))
      ->from($db->quoteName('#__virtuemart_products','vmp'))
      ->join('INNER', $db->quoteName('#__virtuemart_product_categories','pc') . 
        ' ON (' . $db->quoteName('pc.virtuemart_product_id') . ' = ' . $db->quoteName('vmp.product_parent_id') . ')')        
      ->where($db->quoteName('pc.virtuemart_category_id') . ' = '. $db->quote($category). ' AND '. $db->quoteName('vmp.product_parent_id') . ' >0');
$db->setQuery($query);
$podaci = $db->loadAssocList();
2
Oktarin