it-swarm.asia

إرجاع db_select () صفيف

لقد بدأت للتو في استخدام Drupal 7 و db_select().

إذا كان لدي نتيجة من db_select() (مثل $result = $query->execute() ، لماذا يمكنني تكرار هذه النتيجة مرة واحدة فقط؟

يبدو كما لو كان هناك مؤشر لا تتم إعادة تعيينه بعد حلقة foreach.

لذلك حاولت العثور على دالة من شأنها تحويل هذه النتيجة إلى مصفوفة متعددة الأبعاد (على سبيل المثال $result = $result->fetchAllAssoc()) ولكن لم أجد شيئًا.

بدلاً من ذلك ، يتعين علي في الوقت الحالي التكرار خلال النتيجة لإنشاء مجموعة من كائنات الصف لاستخدامها لاحقًا من خلال التعليمات البرمجية (إذا كنت بحاجة إلى التكرار خلالها أكثر من مرة)

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

بالتأكيد يجب أن تكون هناك وظيفة API للقيام بذلك بالفعل.

3
TomGould

ليس لدي Drupal 7 بيئة مطورة سهلة الاستخدام لتجربة ذلك ، ولكن أعتقد أنك تبحث عن fetchAllAssoc () ، كما ذكرت. هذه الصفحة تحتوي على بعض أمثلة الاستعلام المفيدة.

عند استدعاء fetchAllAssoc() ، تحتاج إلى تحديد اسم حقل كمفتاح أساسي للصفيف ، مثل:

 $result->fetchAllAssoc($field);

يبدو أيضًا أن fetchAll () ستعمل (ولكن يبدو أنها ليست الحل الموصى به).

10
hross

نعم ، هناك مشكلة في fetchAll () أو fetchAssoc () لم تستخدمها أيًا منها فقط الكتابة تنفيذ () ستعطيك نتيجة واحدة فقط ستكون شيئًا كالتالي

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

لذا فإن الحل هو استخدام fetchAll() أو fetchAssoc() في حال أردت صفيف زوج key => value.

2
umesh