web-dev-qa-db-fra.com

db_select () renvoie un tableau

Je viens de commencer à utiliser Drupal 7 et db_select().

si j'ai un résultat de db_select() (par exemple $result = $query->execute(), pourquoi ne puis-je parcourir ce résultat qu'une seule fois?

Il semble qu'il y ait un curseur qui n'est pas réinitialisé après une boucle foreach.

J'ai donc essayé de trouver une fonction qui convertirait ce résultat en un tableau multidimensionnel (par exemple $result = $result->fetchAllAssoc()) mais je n'ai rien trouvé.

Au lieu de cela, pour le moment, je dois parcourir le résultat pour créer un tableau d'objets de ligne à utiliser plus tard dans le code (si j'ai besoin de le parcourir plusieurs fois)

/* this returns an array of row objects that you can use like any other array but seems as though there should be an API function to do this for me as part of the database class ? */

$array = array();
foreach($result as $row) {
  $array[] = $row;
}

Il doit sûrement y avoir une fonction API pour le faire déjà.

3
TomGould

Je n'ai pas d'environnement Drupal 7 dev à portée de main pour l'essayer, mais je pense que vous recherchez fetchAllAssoc () , comme vous l'avez mentionné. Cette page contient quelques exemples de requêtes utiles.

Lorsque vous appelez fetchAllAssoc(), vous devez spécifier un nom de champ comme clé primaire du tableau, comme:

 $result->fetchAllAssoc($field);

Il semble également que fetchAll () fonctionnera (mais apparemment ce n'est pas la solution recommandée).

10
hross

Oui, il y a un problème avec fetchAll () ou fetchAssoc () que vous n'utilisez pas l'un ou l'autre, l'écriture de execute () ne vous donnera qu'un seul résultat qui sera quelque chose comme ci-dessous

[dbh] => DatabaseConnection_mysql Object
    (
        [shutdownRegistered:protected] => 
        [target:protected] => default
        [key:protected] => default
        [logger:protected] => 
        [transactionLayers:protected] => Array
            (
            )

        [driverClasses:protected] => Array
            (
                [SelectQuery] => SelectQuery
                [UpdateQuery] => UpdateQuery
                [InsertQuery] => InsertQuery_mysql
            )

        [statementClass:protected] => DatabaseStatementBase
        [transactionSupport:protected] => 1
        [transactionalDDLSupport:protected] => 
        [temporaryNameIndex:protected] √ 0
        [connectionOptions:protected] => Array
            (
                [database] => pcl
                [username] => inhouse
                [password] => abcd!234
                [Host] => localhost
                [port] => 
                [driver] => mysql
                [prefix] => Array
                    (
                        [default] => 
                    )

            )

        [schema:protected] => 
        [prefixes:protected] => Array
            (
                [default] => 
            )

        [prefixSearch:protected] => Array
            (
                [0] => {
                [1] => }
            )

        [prefixReplace:protected] => Array
            (
                [0] => 
                [1] => 
            )

    )

    [queryString] => SELECT u.uid AS uid, u.name AS name
      FROM profile p
      INNER JOIN users_roles ur ON p.uid = ur.uid
      INNER JOIN field_data_field_client fcl ON p.pid = fcl.entity_id
      INNER JOIN field_data_field_category fca ON p.pid = fca.entity_id
      INNER JOIN users u ON p.uid= u.uid
      WHERE  (ur.rid = :db_condition_placeholder_0) AND (fca.field_category_tid = :db_condition_placeholder_1) AND (fca.bundle = :db_condition_placeholder_2) AND (fcl.field_client_tid = :db_condition_placeholder_3) 
      GROUP BY ur.uid
    )

La solution consiste donc à utiliser soit fetchAll(), soit fetchAssoc() au cas où vous souhaiteriez un tableau de paires key => value.

2
umesh