Birden fazla tablo eklemek için bir model içinde Zend_Db_Table adını değiştirmek için nasıl

2 Cevap php

Zend Framework kullanarak, ben bir veritabanına kayıt eklemek için bir model oluşturduk. Benim soru başka bir tabloya bir kayıt eklemek böylece $this->insert($data) nasıl aktif tabloyu geçiş yapabilirsiniz sonra, nedir?

İşte benim kod kadar bulunuyor:

class Model_DbTable_Foo extends Zend_Db_Table_Abstract
{
  protected $_name = 'foo';

  public function addFoo($params)
  {
    $data = array(
      'foo' => $params['foo'],
    );
    $this->insert($data);
    $foo_id = $this->getAdapter()->lastInsertId();

    $data2 = array(
      'bar' => $params['bar']
    );
    // I need to change the Db Table name here.
    $this->insert($data2);
    $bar_id = $this->getAdapter()->lastInsertId();
  }
}

2 Cevap

Zend_Db_Table bir Table Data Gateway olduğunu. O

bir veritabanı tablosuna bir ağ geçidi gibi davranır. Bir örnek tablodaki tüm satırları işler.

Bu demektir, sen masanın başına bir sınıf var. Sizin Model_DbTable_Foo veritabanındaki Foo tablo ve sadece bu tabloyu temsil eder. Bu diğer tabloları ekler yapmak gerekir. Yani için başka bir tablo sınıf kullanmak ne var. Temiz seçenek için birden çok tablo ekler ele bilir senin TDGS üstüne başka bir katman, örneğin eklemek olacaktır

class Model_Gateway_FooBar
{
    protected $_tables;

    public function __construct(Zend_Db_Table_Abstract $foo, 
                                Zend_Db_Table_Abstract $bar)
    {
        $this->_tables['foo'] = $foo;
        $this->_tables['bar'] = $bar;
    }

    public function addFoo($data)
    {
        $this->_tables['foo']->insert($data['foo']);
        // yaddayaddayadda
        $this->_tables['bar']->insert($data['bar']);
    }
}

Ancak, sizin app ve rahatsız ve sadece Foo sınıfındaki diğer sınıfının yeni bir örneğini oluşturmak ve oradan, örneğin ekleme yapmak için karar verebilirsiniz

$otherTable = new Model_DbTable_Bar;
$otherTable->insert($data);

Başka bir seçenek denetleyicisi mantığı koymak olacaktır, ama bu bir kontrolörün sorumluluğunda değildir ve genellikle controllers should be kept thin and models should be fat Çünkü ben, bunu tavsiye edemez.

Birden ekler yapıyoruz bir dipnot düşmek, beklendiği gibi hem ekler, örneğin, iş yapmak için işlemler kullanmak isteyebilirsiniz

$this->_tables['foo']->getAdapter()->beginTransaction();

ve commit() ya da rollback() sorgu sonuca bağlı olarak değişir.

Ayrıca ZF1.9 olarak, aynı zamanda, ilk olarak örneğin somut bir alt sınıfı tanımlamak zorunda kalmadan Zend_Db_Table örneklerini oluşturabilirsiniz unutmayın

$fooTable = new Zend_Db_Table('foo');

Bölümüne bakınız Zend_Db_Table in the ZF Reference Guide.

Ben başka bir Model_DbTable, Model_DbTable_Bar ve ya onu aramak gerektiğini düşünüyorum

internally:

class Model_DbTable_Foo ... {
  public function addFooAndBar() {
    ...
    $bar = new Model_DbTable_Bar();
    $bar->insert($data2);
  }
}

ya da externally,

class ModelX ... {
  public function addFoos() {
    $foo = new Model_DbTable_Foo();
    $foo->insert($data);
    $bar = new Model_DbTable_Bar();
    $bar->insert($data2);
  }
}