web-gelistirme-sc.com

db_select () bir dizi döndürür

Drupal 7 ve db_select() kullanmaya başladım.

db_select()'den (örneğin $result = $query->execute()) bir sonucum varsa, bu sonuçta neden sadece bir kez döngü yapabilirim?

Her foreach döngüsünün ardından sıfırlanmamış bir imleç varmış gibi görünür.

Bu yüzden bu sonucu çok boyutlu bir diziye dönüştürecek bir işlev bulmaya çalıştım (örneğin $result = $result->fetchAllAssoc()) ama hiçbir şey bulamadım.

Bunun yerine, şu anda kod boyunca daha sonra kullanmak için bir satır nesneleri dizisi oluşturmak için sonuç döngü gerekir (eğer birden fazla döngü için gerekirse)

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

Elbette bunu yapmak için bir API işlevi olmalıdır.

3
TomGould

Bunu denemek için kullanışlı bir Drupal 7 dev ortamı yok, ama senin de bahsettiğin gibi fetchAllAssoc () , aradığını düşünüyorum. Bu sayfa yardımcı olabilecek bazı sorgu örnekleri var.

fetchAllAssoc() öğesini çağırdığınızda, dizinin birincil anahtarı olarak bir alan adı belirtmeniz gerekir, örneğin:

 $result->fetchAllAssoc($field);

Ayrıca fetchAll () işe yarayacak gibi görünüyor (ama görünüşe göre önerilen çözüm değil).

10
hross

Evet fetchAll () veya fetchAssoc () ile ilgili bir sorun var, bunlardan herhangi birini kullanmamanız sadece execute () yazma, aşağıdaki gibi bir şey olacak sadece bir sonuç verecektir

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

Bu yüzden çözüm, key => value Çift dizisi istemeniz durumunda fetchAll() veya fetchAssoc() kullanmaktır.

2
umesh