it-swarm-vi.com

db_select () trả về một mảng

Tôi mới bắt đầu sử dụng Drupal 7 và db_select().

nếu tôi có kết quả từ db_select() (ví dụ: $result = $query->execute(), tại sao tôi chỉ có thể lặp qua kết quả này một lần?

Nó xuất hiện như thể có một con trỏ không được đặt lại sau vòng lặp foreach.

Vì vậy, tôi đã cố gắng tìm một hàm có thể chuyển đổi kết quả này thành một mảng đa chiều (ví dụ: $result = $result->fetchAllAssoc()) nhưng tôi không tìm thấy gì.

Thay vào đó, tại thời điểm này tôi phải lặp qua kết quả để tạo một mảng các đối tượng hàng để sử dụng sau này thông qua mã (nếu tôi cần lặp qua nó nhiều lần)

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

Chắc chắn phải có một hàm API để làm điều này rồi.

3
TomGould

Tôi không có Drupal 7 dev môi trường tiện dụng để thử điều này, nhưng tôi nghĩ bạn đang tìm kiếm fetchAllAssoc () , như bạn đã đề cập. Trang này có một số ví dụ truy vấn hữu ích.

Khi bạn gọi fetchAllAssoc(), bạn cần chỉ định tên trường làm khóa chính của mảng, như:

 $result->fetchAllAssoc($field);

Có vẻ như fetch ALL () sẽ hoạt động (nhưng rõ ràng đó không phải là giải pháp được đề xuất).

10
hross

Có, có một vấn đề với fetchAll () hoặc fetchAssoc () mà bạn chưa sử dụng, chỉ cần viết exec () sẽ chỉ cung cấp cho bạn một kết quả giống như bên dưới

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

Vì vậy, giải pháp là sử dụng một trong hai fetchAll() hoặc fetchAssoc() trong trường hợp bạn muốn một mảng cặp key => value.

2
umesh