سؤال

أكتب تطبيقا يتطلب حدوث مفتاح Master / Slave داخل طبقة التطبيق. كما هو الحال الآن، أقوم بإنشاء كائن ZenD_DB_TABE على إنشاء MAPPER، ثم SetDefaultAdapter إلى الرقيق.

الآن داخل Mapper Classe، لدي الطريقة التالية:

public function useWriteAdapter()
{
    if(Zend_Db_Table_Abstract::getDefaultAdapter() != $this->_writeDb)
    {
        Zend_Db_Table_Abstract::setDefaultAdapter($this->_writeDb);
        $this->_tableGateway = new Zend_Db_Table($this->_tableName);
    }
}

أحتاج إلى فحص العقلية في هذا. لا أعتقد أن النفقات العامة أكثر من اللازم، وأنا فقط أشك في أنه يجب أن يكون هناك طريقة أفضل.

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

المحلول

كائن من النوع Zend_Db_Table_Row_Abstract يتذكر ما أنتج كائن الجدول ذلك. ولكن يمكنك تغيير الجدول المرتبط قبل الاتصال save().

$readDb = Zend_Db::factory(...);  // slave
$writeDb = Zend_Db::factory(...); // master
Zend_Db_Table::setDefaultAdapter($readDb);

$myReadTable = new MyTable(); // use default adapter
$myWriteTable = new MyTable($writeDb);

$row = $myTable->find(1234)->current();

$row->column1 = 'value';

$row->setTable($myWriteTable);

$row->save();

نصائح أخرى

ماذا عن شيء مثل الطبقة الأساسية التي تمتد والتي تنفذ بدء التشغيل؟

class My_Db_Table extends Zend_Db_Table
{
    function init() 
    {
        if (....) {
           // set the default adaptor to the write-DB-master
        }
        parent::init();
    }
}
// all your models then extend My_Db_Table instead of Zend_Db_Table

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

مددت Zend_DB_ADAPTER_ABSTRACT وأضاف سمة Boolean $ يكتب. أضفت أساليب Getter العامة وطرائق العرض لها أيضا.

يحفظ محولي تكوينات قاعدة بيانات مختلفة / -Connections: واحد للماجستير (للكتابة) وواحد للعبد (للقراءة). (في الواقع ليس تكوين واحد ولكن الكثير لذلك لدي نوع من مجموعة من الماجستير والحلال التي يتم اختيارها بشكل عشوائي بالوزن.)

الآن أقوم بما يلي: قبل أن أقوم بتنفيذ Query $ يكتب يجب تعيينه على True أو False. في طريقة الاتصال () يتصل المحول أو يستخدم الاتصال الصحيح اعتمادا على قيمة الكتابة $.

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