web-dev-qa-db-fra.com

Comment écrire ma requête MySQL avec la logique JOIN à l'aide des méthodes JDatabase?

J'ai du mal à traduire ce script SQL en méthodes JDatabase car je ne trouve pas la méthode de requête AND.

SELECT user.firstname, user.lastname, leadership.leadname, leadership.lead_des
FROM CLUB,LEADERSHIP,USER
WHERE CLUB.CLUB_ID=11
AND LEADERSHIP.USER_ID=USER.USER_ID
AND CLUB.CLUB_ID=Leadership.CLUB_ID;

Je regardais le documentation de JDatabase mais je ne vois rien là-dedans avec AND.

Comment puis-je écrire ma requête en utilisant la syntaxe de requête de Joomla?

3
Sosa
$db = JFactory::getDbo();
$query = $db->getQuery(true)
  ->select('user.firstname, user.lastname, leadership.leadname, leadership.lead_des')
  ->from('CLUB,LEADERSHIP,USER')
  ->where('CLUB.CLUB_ID=11')
  ->where('LEADERSHIP.USER_ID=USER.USER_ID')
  ->where('CLUB.CLUB_ID=Leadership.CLUB_ID');

Plusieurs clauses where par défaut matraquées avec AND. Vous pouvez indiquer explicitement la colle (AND ou OR) en tant que deuxième option de la fonction where ci-dessus, bien qu’elle soit facultative. Citation tirée de la documentation de l'API Joomla pour JDatabaseQuery-> où fonction:

string $ glue - La colle permettant de rejoindre les conditions. La valeur par défaut est AND. Notez que la colle est fixée lors de la première utilisation et ne peut pas être changée.

Sinon, vous pouvez combiner manuellement en une seule clause where. Vous pouvez utiliser cette méthode pour mélanger OR et AND dans les clauses where d'une requête complexe.

$query = $db->getQuery(true)
  ->select('user.firstname, user.lastname, leadership.leadname, leadership.lead_des')
  ->from('CLUB,LEADERSHIP,USER')
  ->where('CLUB.CLUB_ID=11 AND LEADERSHIP.USER_ID=USER.USER_ID AND CLUB.CLUB_ID=Leadership.CLUB_ID');
6
Nagarjun

Vous pouvez utiliser la clause and comme suit:

$query->where('CLUB.CLUB_ID = USER.USER_ID', 'AND')
      ->where('LEADERSHIP.USER_ID = USER.USER_ID', 'AND')
      ->where('CLUB.CLUB_ID = Leadership.CLUB_ID');
1
Lodder

Utiliser des virgules comme moyen de JOIN tables est une ancienne syntaxe de style. Plus récemment, MySQL a proposé davantage de mots-clés pour mieux décrire l’intention de rejoindre (amélioration de la lisibilité du code).

Vos virgules représentent INNER JOIN, Et Joomla leur a attribué une méthode de requête.

Ci-dessous, je recommanderai un bloc try {} catch{} Qui facilitera la gestion et le débogage de votre code. Aucune de vos tables, colonnes ou valeurs ne nécessite de retour à la ligne ou de guillemets, je n'appellerai donc aucune méthode $db->qn() ou $db->q(). Si votre requête real a des variables ou a besoin de ces considérations, votre extrait de code est bien adapté pour recevoir ces modifications.

$db = JFactory::getDbo();
try {
    $query = $db->getQuery(true)
                ->select(
                    array("a.firstname", "a.lastname", "b.leadname", "b.lead_des")
                  )
                ->from("club a")
                ->innerJoin("leadership b ON a.club_id = b.club_id")
                ->innerJoin("user c ON b.user_id = c.user_id")
                ->where('a.club_id = 11');
    //echo $query->dump();
    $db->setQuery($query);
    $resultset = $db->loadAssocList();
    if (!$resultset) {
        echo "No Rows In Resultset";
    } else {
        foreach ($resultset as $row) {
            echo "<div>";
                echo "<div>First Name: {$row['firstname']}</div>";
                echo "<div>Last Name: {$row['lastname']}</div>";
                echo "<div>Lead Name: {$row['leadname']}</div>";
                echo "<div>Lead Description: {$row['lead_des']}</div>";
            echo "</div>";
        }
    }
} catch (Exception $e) {
    echo "Syntax Error "; // . $e->getMessage();
}
0
mickmackusa
$db = JFactory::getDbo();
$query = $db->getQuery(true);

// Select records from tables based on condition

$query->select('user.firstname, user.lastname, leadership.leadname, leadership.lead_des');
$query->from('CLUB, LEADERSHIP, USER');
$query->where('CLUB.CLUB_ID=11 AND LEADERSHIP.USER_ID=USER.USER_ID AND CLUB.CLUB_ID=Leadership.CLUB_ID');

$db->setQuery($query);
$result = $db->loadObjectList();

// fetch result

foreach($result as $row) {
    echo "First name ".$row->firstname;
    echo "Last name ".$row->lastname;
}
0
cslearner