it-swarm.it

db_select () restituisce un array

Ho appena iniziato a usare Drupal 7 e db_select().

se ho un risultato da db_select() (ad es. $result = $query->execute(), perché posso scorrere questo risultato solo una volta?

Sembra che ci sia un cursore che non viene ripristinato dopo un ciclo foreach.

Quindi ho cercato di trovare una funzione che convertisse questo risultato in un array multidimensionale (ad esempio $result = $result->fetchAllAssoc()) ma non ho trovato nulla.

Invece, al momento devo passare in rassegna il risultato per creare una matrice di oggetti riga da utilizzare in seguito attraverso il codice (se devo scorrere più di una volta)

/* 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;
}

Sicuramente ci deve essere una funzione API per farlo già.

3
TomGould

Non ho un Drupal 7 ambiente di sviluppo utile per provare questo, ma penso che tu stia cercando fetchAllAssoc () , come hai detto. Questa pagina contiene alcuni esempi di query che sono utili.

Quando si chiama fetchAllAssoc(), è necessario specificare un nome campo come chiave primaria dell'array, come:

 $result->fetchAllAssoc($field);

Sembra anche che fetchAll () funzionerà (ma a quanto pare non è la soluzione consigliata).

10
hross

Sì, c'è un problema con fetchAll () o fetchAssoc () che non hai mai usato o semplicemente scrivendo execute () ti darà solo un risultato che sarà qualcosa come sotto

[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
    )

Quindi la soluzione consiste nell'utilizzare fetchAll() o fetchAssoc() nel caso in cui si desideri un array di coppie key => value.

2
umesh