الانضمام تلقائيًا الجداول دون كسر السلوك الافتراضي في إطار Zend

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

  •  04-07-2019
  •  | 
  •  

سؤال

الموقف على النحو التالي: لدي نموذجان: "الإجراء" و "المستخدم". تشير هذه النماذج إلى "إجراءات" الجداول و "المستخدمين" ، على التوالي.

يحتوي جدول الإجراء الخاص بي على عمود user_id. في هذه اللحظة ، أحتاج إلى نظرة عامة على جميع الإجراءات ، والمستخدمين الذين تم تعيينهم لهم. عندما أستخدم $action->fetchAll(), ، ليس لدي سوى معرف المستخدم ، لذلك أريد أن أكون قادرًا على الانضمام إلى البيانات من نموذج المستخدم ، ويفضل أن يكون ذلك دون إجراء مكالمة findDependentRowset().

فكرت في إنشاء العرف fetchAll(), fetchRow() و find() الأساليب في النموذج الخاص بي ، ولكن هذا من شأنه أن يكسر السلوك الافتراضي.

ما هي أفضل طريقة لحل هذه المشكلة؟ أي مساعدة سيكون موضع تقدير كبير.

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

المحلول

لقد صممت وتنفيذ ميزة العلاقات بين الجدول في إطار Zend.

تعليقي الأول هو أنك لن تستخدم findDependentRowset() على أي حال - كنت تستخدم findParentRow() إذا كان للإجراء إشارة مفتاح خارجي إلى المستخدم.

$actionTable = new Action();
$actionRowset = $actionTable->fetchAll();
foreach ($actionRowset as $actionRow) {
  $userRow = $actionRow->findParentRow('User');
}

يحرر: في الحلقة ، لديك الآن $ ActionRow وكائن userrow $. يمكنك كتابة التغييرات مرة أخرى إلى قاعدة البيانات من خلال أي كائنات عن طريق تغيير حقول الكائنات والاتصال save() على الكائن.

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

$actionTable = new Action();
$actionQuery = $actionTable->select()
  ->setIntegrityCheck(false) // allows joins
  ->from($actionTable)
  ->join('user', 'user.id = action.user_id');
$joinedRowset = $actionTable->fetchAll($actionQuery);
foreach ($joinedRowset as $joinedRow) {
  print_r($joinedRow->toArray());
}

لاحظ أن مثل هذه الصفوف المستندة إلى استعلام Join هو القراءة فقط. لا يمكنك تعيين قيم الحقل في كائنات الصف والاتصال save() لنشر التغييرات مرة أخرى إلى قاعدة البيانات.

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

action_id  action_type  user_id  user_name
   1          Buy          1       Bill
   2          Sell         1       Bill
   3          Buy          2       Aron
   4          Sell         2       Aron

التالي للصف مع Action_id = 1 ، أقوم بتغيير أحد الحقول التي جاءت من كائن المستخدم:

$joinedRow->user_name = 'William';
$joinedRow->save();

الأسئلة: عندما أشاهد الصف التالي مع Action_id = 2 ، هل يجب أن أرى "Bill" أو "William"؟ إذا كان "وليام" ، هل يعني هذا أن حفظ الصف 1 يجب أن يحديث "بيل" تلقائيًا إلى "وليام" في جميع الصفوف الأخرى في مجموعة النتائج هذه؟ أم يعني ذلك save() يعيد تشغيل استعلام SQL تلقائيًا للحصول على مجموعة نتائج منتعشة من قاعدة البيانات؟ ماذا لو كان الاستعلام يستغرق وقتًا طويلاً؟

النظر أيضا في التصميم الموجهة للكائن. كل صف هو كائن منفصل. هل من المناسب الاتصال save() على كائن واحد له تأثير جانبي لتغيير القيم في كائن منفصل (حتى لو كانت جزءًا من نفس مجموعة الكائنات)؟ هذا يبدو وكأنه شكل من أشكال اقتران المحتوى إلي.

المثال أعلاه هو استعلام بسيط نسبيًا ، ولكن يُسمح أيضًا باستعلامات أكثر تعقيدًا. لا يمكن لـ Zend_DB تحليل الاستفسارات بقصد تحديد النتائج القابلة للكتابة من نتائج القراءة فقط. هذا أيضًا هو السبب في أن طرق عرض MySQL ليست قابلة للتحديث.

نصائح أخرى

يمكنك دائمًا تقديم طريقة عرض في قاعدة البيانات الخاصة بك والتي تقوم بالانضمام لك.

CREATE OR REPLACE VIEW VwAction AS
SELECT [columns]
  FROM action
  LEFT JOIN user
    ON user.id = action.user_id

ثم استخدم فقط

$vwAction->fetchAll();

فقط تذكر أن وجهات النظر في MySQL هي القراءة فقط (على افتراض أن هذا هو mysql)

ألا يقوم إنشاء جدول SQL بحل جيد لجعل المفصل؟ وبعد فئة طاولة بسيطة للوصول إليها

أعتقد أنه من الأفضل أن يكون منطقك في SQL منه في PHP

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top