web-dev-qa-db-fra.com

Drupal 8 Recherche d'une alternative élégante de rowCount dans une requête

Dans Drupal 8, nous ne pouvons plus utiliser la propriété rowCount dans le cas d'une instruction select. Existe-t-il une alternative élégante?

Je peux utiliser un foreach, mais lors de la conversion de Drupal 7 je voudrais remplacer le résultat-> rowCount () plus élégamment

4
Bart van Leeuwen

Selon API Drupal , "dans D8 rowCount () est le nombre de lignes affectées par la dernière instruction DELETE, INSERT ou UPDATE exécutée ou lève\Drupal\Core\Database\RowCountException si la dernière exécutée était SELECT. "

Si vous devez sélectionner le nombre de lignes, vous pouvez utiliser $ query-> addExpression ('COUNT (*)');

   $query = \Drupal::database()->select('table', 't');
   $query->addExpression('COUNT(*)');
   $count = $query->execute()->fetchField();

Vous pouvez essayer ceci:

$query = db_select('node', 'n')->fields('n', ['nid'])->execute();
$query->allowRowCount = TRUE;
$count = $query->rowCount();

Ou:

$query = db_query('Select * from node');
$query->allowRowCount = TRUE;
$count = $query->rowCount();

Remarque:db_select() et db_query() sont marqués comme obsolètes, seront supprimés dans Drupal 9.0.0. Au lieu de cela, obtenez une connexion à la base de données injectée dans votre service à partir du conteneur et appelez select() ou query() dessus.

3
rpayanm

La définition de la propriété allowRowCount sur TRUE n'est pas un bon moyen de résoudre ce problème.

Une meilleure façon de le faire est d'utiliser la fonction intégrée countQuery :

$query = db_select('node', 'n')->fields('n', ['nid']);
if ($query->countQuery()->execute()->fetchField()) {
  $result = $query->execute();
}
0
Scott Joudry

Voici comment je l'ai fait:

$database = \Drupal::database();
$query = $database->select('node__field_node_url', 'nnu');
$query->addField('nnu', 'entity_id');
$query->condition('nnu.field_node_url_uri', "entity:node/" . $article->entity_id);
$results = $query->execute()->fetchAll();
$count = count($results);
0
Achraf JEDAY

rowCount() est pris en charge pour les instructions DELETE, INSERT ou UPDATE exécutées uniquement avec des générateurs de requêtes structurées, car elles ne seraient pas portables entre les moteurs de base de données sinon

0
Henry Tran