web-dev-qa-db-fra.com

Comment réécrire sql pour joomla JDatabase

Je suis nouveau dans le codage Joomla personnalisé, alors excusez-moi, je veux exécuter l'instruction suivante:

"SELECT 
    MAX(CASE WHEN v.FieldName = 'Team_Name' THEN v.FieldValue END) 'Team_Name'
    , MAX(CASE WHEN v.FieldName = 'Manager_Name' THEN v.FieldValue END) 'Manager_Name'
FROM `team_values` v  
where tournamentId=5"

mais je ne sais pas trop comment l'écrire, j'ai essayé plusieurs scénarios, mais ils n'ont pas fonctionné pour moi.

1
Gibzy

Je pense que vous demandez, le code Joomla pour exécuter la requête?

si oui

$db = JFactory::getDBo();
$query = $db->getQuery(true);
$query->select("MAX(CASE WHEN v.FieldName=".$db->q('Team_Name')." THEN v.FieldValue END) as Team_Name, MAX(CASE WHEN v.FieldName = ".$db->q('Manager_Name')." THEN v.FieldValue END) as Manager_Name")->from('#__team_values as v')->where('v.tournamentId='.$db->q(5));
$db->setQuery($query);
$final_data = $db->loadObject();
1
Alagesan

Si vous êtes nouveau, j'aimerais inclure une vérification d'erreur de base, ainsi que l'impression de la requête générée et du jeu de résultats à 2 colonnes.

Code non testé:

$db = JFactory::getDBO();
try {
    $query = $db->getQuery(true)
                ->select(
                    array(
                        "MAX(CASE WHEN v.FieldName = 'Team_Name'
                                  THEN v.FieldValue END) 'Team_Name'",
                        "MAX(CASE WHEN v.FieldName = 'Manager_Name'
                                  THEN v.FieldValue END) 'Manager_Name'"
                    )
                  )
                ->from("#__team_values v")
                ->where("v.tournamentId = 5");
    echo $query->dump();    // only if you  wish to see what is generated. Of course, don't do this on your live/public site
    $db->setQuery($query);
    echo "<pre>";
        var_export($db->loadAssocList());  // display the resultset
    echo "</pre>";
} catch (Exception $e) {
    echo "<div>", $e->getMessage(), "</div>";  // show error, if any.  Of course, don't do this on your live/public site
}

Comme votre requête n'utilise aucune variable ni mot clé réservé mysql, vous pouvez réduire le fardeau de code en omettant les appels $db->q() et $db->qn() pour citer les noms de tables, les colonnes et les valeurs. Le nombre entier 5 n'a pas besoin d'être guillemet simple.

Je préfère enchaîner les méthodes de requête -> De getQuery afin que $query N'ait pas besoin d'être réécrit.

Si vous voulez voir une question similaire à laquelle j'ai répondu avec une requête entièrement citée par joomla, lisez cet article .

J'ai des incertitudes/préoccupations ...

Ceci est juste une reproduction de votre SQL utilisant les appels de méthode Joomla SQL. Je ne suis pas tout à fait sûr que cette requête fonctionnera comme vous le souhaitez. Si vous fournissez une démonstration SQLFiddle de votre structure/données de table et expliquez le résultat attendu, je serai en mesure de vérifier ou de corriger la requête elle-même. loadRowList(), loadAssocList() et loadObjectList() génèrent un résultat multi-ligne, mais si vous n'attendez qu'une seule ligne, alors loadRow(), loadAssoc() ou loadObject() conviendra mieux.

MAX() est un choix étrange si FieldValue n'est pas numérique; peut-être que ce n’est pas mieux pour votre requête. Peut-être pouvez-vous nous expliquer pourquoi vous utilisez MAX(). Si les valeurs FieldValue sont numériques, la décision de nommer les FieldName valeurs [Word]_Name Me préoccupe. Je veux dire, peut-être que [Word]_id Serait plus approprié.

1
mickmackusa