العلاقات الإطار زند - تحديد أسماء الأعمدة في findManyToManyRowset ()؟

StackOverflow https://stackoverflow.com/questions/1438721

سؤال

وأنا أعمل على تطبيق تطويرها باستخدام الإطار زند. لقد حددت العلاقة في النماذج، ويمكن استخدامها لحسن الحظ، منها مثلا:

$rowset = $row->findManyToManyRowset('People', 'Jobs');

ولكن، لقد ضرب مشكلة حيث يتم إرجاع صفوف لديها أسماء الأعمدة هي نفسها في "الشعب" و "وظائف"، وبالتالي، يدمج مفاتيح مجموعة، وفقدان بعض البيانات من الصفوف النهائية.

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

$select = $this->select()->from(array(
                                     'p' => 'people', 
                                     'j' => 'jobs'
                                     ),
                                array( 
                                     'person_id' => 'p.id',
                                     'job_id' => 'j.id',
                                     'person_code' => 'p.code',
                                     'job_code' => 'j.code'
                                     )
                                );  

إذا أحاول استخدام رمز أعلاه، وأحصل على رسالة مثل:

Error: No reference rule "" from table People to table Jobs

ويمكن لأي شخص أن تنورني بشأن الكيفية التي ينبغي أن يتم هذا؟ وأنا أعلم أنني يمكن تغيير أسماء مقالي في قاعدة البيانات، ولكن أنا كنت تفضل تغيير كود بدلا من إعادة تصميم هيكل بلدي DB وتحديث كافة التعليمات البرمجية ذات الصلة.

ملحوظة: من دون شكل من أشكال العمود التعرج على النحو الوارد أعلاه، عاد صفوف يشبه هذا (أي أنه يدمج الأعمدة مع نفس الأسماء.):

[_data:protected] => Array
    (
        [id] => 1
        [code] => SX342
    )

وابتهاج،
  مات

هل كانت مفيدة؟

المحلول

وتوصيتي الأولى هي أنه يجب أن لا تسمية الأعمدة هذه أسماء عامة مثل id وcode. هذه الأسماء لا معنى لها، وكما كنت قد اكتشفت أنها تؤدي أيضا في اصطدام عند جلب النتائج في مجموعة النقابي.

وأنت أيضا باستخدام تحديد واجهة بشكل غير صحيح. يجب تحديد جدول واحد فقط لكل مكالمة from() أو دعوة join().

وأخيرا، وأنا لم تحاول أن تفعل استعلامات معقدة من خلال واجهة العلاقات Zend_Db_Table. والمقصود فقط لحالات بسيطة. إذا كان لديك استعلام أكثر تعقيدا، مجرد كتابة الاستعلام SQL صراحة.

وانظر أيضا كيف للقيام استعلام انضم في واجهة الجداول ZF؟

نصائح أخرى

وأنا أعلم أن هذا الجواب يأتي في وقت متأخر قليلا ولكن هنا بعض الأشياء أن نشير إلى.

1) findManyToManyRowset($matchTable, $intersectionTable, $callerRefRule, $matchRefRule, $select); - إذا كنت تمرير Zend_Db_Table_Select كنت تريد الذهاب الى لتمرير null لقواعد

2) يجب إنشاء Zend_Db_Table_Select تمريرها إلى findManyToManyRowset() من $matchTable ومن الأسلم أن نفترض أن في i بنود حيث هو الاسم المستعار للجدول التقاطع، وm هو الاسم المستعار للجدول المباراة.

و3) في حالة التصادم، وm الفوز اسم مفتاح في مجموعة النقابي عاد في بي. الاستعلام أعدم يبدو مثل هذا:

  SELECT 
    `i`.*, `m`.* 
  FROM 
    `interscetTable` AS `i` 
  INNER JOIN 
    `matchTable` AS `m` 
  ON
    `i`.`fk_m` = `m`.`pk` WHERE (`i`.`fk_o` = ?)  

و4) لا يهم ما، قيمة الإرجاع من findManyToManyRowset() سيتم مجموعة الصفوف خلق من $matchTable ذلك، إذا كنت بحاجة لالتقاط أي معلومات من الجدول المتقاطعة، أثناء التقاط أيضا البيانات للجدول مباراة، ستحتاج على الارجح لديك Zend_Db_Select العرف وتجنب استخدام الاشياء Zend_Db_Table لتعيين البيانات على أي حال.

وهكذا مثال العمل، وذلك باستخدام "الناس" كما في الجدول المباراة "العمال" كما في الجدول التقاطع ويتيح القول "عملاء" كما في الجدول الأصلي .. وإذا افترضنا على سبيل المثال هذا أن الجداول تصل معا شيء من هذا القبيل:  People.id:... -> workers.person_id:client_id:job_id -> عملاء: id:...

$client = $clientTable->fetchRow(); /// grab a random client

// fetch all people that have worked for the client ordered by their last name.
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('m.lastname')); 

// fetch all people that have worked for the client ordered by their hire date:
// `workers`.`hiredate`
$client->findManyToManyRowset("People", "Workers", null, null, 
  $peopleTable->select()->order('i.hiredate')); 
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top