logo

Types de blocs supplémentaires (EBT) – Nouvelle expérience de Layout Builder❗

Types de blocs supplémentaires (EBT) – types de blocs stylisés et personnalisables : diaporamas, onglets, cartes, accordéons et bien d’autres. Paramètres intégrés pour l’arrière-plan, la boîte DOM, les plugins JavaScript. Découvrez dès aujourd’hui le futur de la création de mises en page.

Démo des modules EBT Télécharger les modules EBT

❗Types de paragraphes supplémentaires (EPT) – Nouvelle expérience Paragraphes

Types de paragraphes supplémentaires (EPT) – ensemble de modules basé sur les paragraphes analogiques.

Démo des modules EPT Télécharger les modules EPT

Défilement
05/07/2025, by Ivan

Les requêtes dynamiques se réfèrent aux requêtes créées dynamiquement par Drupal, plutôt qu’à une chaîne de requête explicite. Toutes les requêtes d’insertion, de mise à jour, de suppression et de fusion doivent être dynamiques. Les requêtes de sélection peuvent être statiques ou dynamiques. Par conséquent, « requête dynamique » fait généralement référence à une requête Select dynamique.

Remarque : dans 90 % des cas d’utilisation d’une requête select, vous aurez une requête statique. Si vous êtes dans un chemin critique de performance, vous devez utiliser query() plutôt que select() pour des raisons de performance. Utilisez les requêtes dynamiques uniquement si certaines parties de la requête varient (par exemple : ajout de conditions WHERE selon le contexte) ou si elles doivent être modifiables.

Toutes les requêtes créées dynamiquement sont créées à l’aide d’un objet requête obtenu depuis l’objet de connexion à la base de données approprié. Comme pour les requêtes statiques, dans la très grande majorité des cas, une interface procédurale peut être utilisée pour l’objet requête. Cependant, les instructions suivantes pour la requête prennent la forme d’appels de méthodes sur l’objet requête.

Les requêtes Select dynamiques sont lancées à l’aide de la méthode select() comme suit :

$database = \Drupal::database();
$query = $database->select('mytable', 'mt', $options);

Ici, mytable est la table de base de la requête ; la première table après l’opérateur FROM. Notez qu’il ne doit pas y avoir de parenthèses autour. Le constructeur de requêtes gère cela automatiquement. Le deuxième paramètre est un alias pour la table. S’il n’est pas indiqué, le nom de la table est utilisé. Le tableau $options est optionnel et identique au tableau $options pour les requêtes statiques.

La valeur retournée par l’appel $database->select() est un objet de type Select. Donc, le type de la variable $query après cet appel est un objet Select. Cet objet possède une liste complète de méthodes comme fields(), joins() et group() qui peuvent être appelées pour affiner la requête.

Les requêtes Select dynamiques peuvent être très simples ou très complexes. Nous allons examiner ci-dessous les parties individuelles constituant une requête simple, et sur les pages suivantes nous verrons des méthodes plus complexes telles que les jointures.

Vue d’ensemble

Voici une requête relativement simple sur la table users.

Supposons que nous voulons créer une requête dynamique approximativement équivalente à la requête statique suivante :

$result = $database->query("SELECT uid, name, status, created, access FROM {users} u WHERE uid <> 0 LIMIT 50 OFFSET 0");

L’équivalent dynamique commence comme suit :

// Créer un objet de type Select.
$database = \Drupal::database();
$query = $database->select('users', 'u');
 
// Ajouter des détails supplémentaires à cet objet requête : une condition, des champs et une plage.
$query->condition('u.uid', 0, '<>');
$query->fields('u', ['uid', 'name', 'status', 'created', 'access']);
$query->range(0, 50);

Ceci est souvent écrit en syntaxe raccourcie utilisée pour appeler plusieurs méthodes de l’objet $query en chaîne. Donc, le code ci-dessus est souvent écrit ainsi :

// Créer un objet de type Select.
$query = $database->select('users', 'u');
 
// Ajouter des détails supplémentaires à cet objet requête : une condition, des champs et une plage.
$query->condition('u.uid', 0, '<>')
  ->fields('u', ['uid', 'name', 'status', 'created', 'access'])
  ->range(0, 50);

En effet, le code peut être simplifié encore d’un cran en chaînant directement l’appel $database->select() avec les appels de méthodes sur l’objet retourné. Cela donne :

// Créer un objet de type Select et ajouter directement des détails supplémentaires
// à cet objet requête : une condition, des champs et une plage.
$query = $database->select('users', 'u')
  ->condition('u.uid', 0, '<>')
  ->fields('u', ['uid', 'name', 'status', 'created', 'access'])
  ->range(0, 50);

C’est la forme simplifiée de la requête utilisée par la page d’administration des utilisateurs, à laquelle vous pouvez vous référer pour approfondir.

Exécution de la requête

Une fois la requête construite, appelez la méthode execute() pour compiler et exécuter la requête.

$result = $query->execute();

La méthode execute() retournera un objet de résultat / statement identique à celui retourné par la fonction $database->query(), et il peut être itéré ou extrait de la même manière :

$result = $query->execute();
foreach ($result as $record) {
  // Faire quelque chose avec chaque $record.
}

Remarque. Faites attention lors de l’utilisation des méthodes suivantes avec une requête dynamique multi-colonnes :

Ces méthodes exigent actuellement des indices numériques de colonnes (0, 1, 2, etc.) plutôt que des alias de table. Cependant, le constructeur de requêtes ne garantit pas un ordre déterminé pour les champs retournés, donc les colonnes peuvent ne pas être dans l’ordre attendu. En particulier, les expressions sont toujours ajoutées après les champs, même si vous les avez ajoutées d’abord dans votre requête. (Ce problème ne concerne pas les requêtes statiques qui retournent toujours les colonnes dans l’ordre spécifié.)

Débogage

Pour examiner la requête SQL que l’objet requête utilise à un moment donné de son cycle de vie, affichez l’objet requête. Pour vérifier les arguments, regardez le tableau retourné par la méthode arguments() :

echo $query;
print_r($query->__toString());
print_r($query->arguments());