Модели Zend и отношения с базой данных

я начинаю с Zend Framework и немного запутался с моделями и отношениями (один ко многим, многие ко многим и т. д.).

В «Быстром старте Zend Framework» говорится о создании Zend_Db_Table, Data Mapper и, наконец, нашего класса модели.

Предположим, у нас есть такая база данных:

table A (
id integer primary key,
name varchar(50)
);

table B (
id integer primary key,
a_id integer references A
);

затем я создам:

Application_Model_DbTable_A extends Zend_Db_Table_Abstract,
Application_Model_AMapper,
Application_Model_A,

Application_Model_DbTable_B extends Zend_Db_Table_Abstract,
Application_Model_BMapper,
Application_Model_B,

если я понял, я должен хранить информацию о ссылках в Application_Model_DbTable_A:

protected $_dependentTables = array('B');

и Application_Model_DbTable_B:

protected $_referenceMap = array(
    'A' => array(
        'columns' => array('a_id'),
        'refTableClass' => 'A',
        'refColums' => array('id')
    )
);

и мой класс моделей:

class Application_Model_A
{
    protected $_id;
    protected $_name;

    public function __construct(array $options = null)
    {
        if(is_array($options)) {
        $this->setOptions($options);
        }       
    }

    public function __set($name, $value)
    {
        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid property');
        }
        $this->$method($value);
    }

    public function __get($name)
    {
        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid property');
        }
        return $this->$method();
    }

    public function setOptions(array $options)
    {
        $methods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }
        return $this;
    }

    public function setName($name)
    {
        $this->_name = (string) $name;
        return $this;
    }

    public function getName()
    {
        return $this->_name;
    } 

    public function setId($id)
    {
        $this->_id = (int) $id;
        return $this;
    }

    public function getId() 
    {
        return $this->_id;
    }

class Application_Model_B
{
    protected $_id;
    protected $_a_id;

    public function __construct(array $options = null)
    {
        if(is_array($options)) {
        $this->setOptions($options);
        }       
    }

    public function __set($name, $value)
    {
        $method = 'set' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid property');
        }
        $this->$method($value);
    }

    public function __get($name)
    {
        $method = 'get' . $name;
        if (('mapper' == $name) || !method_exists($this, $method)) {
            throw new Exception('Invalid property');
        }
        return $this->$method();
    }

    public function setOptions(array $options)
    {
        $methods = get_class_methods($this);
        foreach ($options as $key => $value) {
            $method = 'set' . ucfirst($key);
            if (in_array($method, $methods)) {
                $this->$method($value);
            }
        }
        return $this;
    }

    public function setA_id($a_id)
    {
        $this->_a_id = (int) $a_id;
        return $this;
    }

    public function getA_id()
    {
        return $this->_a_id;
    } 

    public function setId($id)
    {
        $this->_id = (int) $id;
        return $this;
    }

    public function getId() 
    {
        return $this->_id;
    }       

это так?


person M-S    schedule 20.03.2011    source источник
comment
Вы пробовали, работает? Если нет, то какие сообщения об ошибках вы получаете?   -  person markus    schedule 20.03.2011
comment
я думаю, он пытается понять, как zend framework обрабатывает сопоставление «многие к одному» и «один ко многим» и, возможно, каскадный эффект.   -  person KJYe.Name 葉家仁    schedule 20.03.2011
comment
Можете ли вы попробовать уменьшить свой код вдвое и задать более конкретные вопросы, соответственно. запишите свой протокол громкого мышления.   -  person markus    schedule 20.03.2011


Ответы (2)


Предположим, у вас есть таблица БД с именем products. Вы хотите получить доступ к этой таблице и работать с данными.

Сначала вам нужно в папке models/dbtable/ файл Product.php указать zf, где искать данные:

class Default_Model_DbTable_Product extends Zend_Db_Table_Abstract
{
    protected $_name = 'products';

}

Итак, $_name — это имя таблицы БД. Во-вторых, вам нужен класс, в котором вы храните всю информацию, такую ​​как атрибуты продукта. Допустим, у продукта есть только имя:

class Default_Model_Product{

    protected $_name;

    public function setName($name) {
        $this->_name = $name;
        return $this;
    }

    public function getName() {
        return $this->_name;
    }

    public function __construct(array $options = null) {
        if (is_array ( $options )) {
            $this->setOptions ( $options );
        }
    }
    //you need the methods below to access an instanz of this class
    //put it in every model class
    public function __set($name, $value) {
        $method = 'set' . $name;
        if (('mapper' == $name) || ! method_exists ( $this, $method )) {
            throw new Exception ( 'Invalid product property' );
        }
        $this->$method ( $value );
    }

    public function __get($name) {
        $method = 'get' . $name;
        if (('mapper' == $name) || ! method_exists ( $this, $method )) {
            throw new Exception ( 'Invalid product property' );
        }
        return $this->$method ();
    }

    public function setOptions(array $options) {
        $methods = get_class_methods ( $this );
        foreach ( $options as $key => $value ) {
            $method = 'set' . ucfirst ( $key );
            if (in_array ( $method, $methods )) {
                $this->$method ( $value );
            }
        }
        return $this;
    }
}

Наконец, вам нужен класс картографа, где вы фактически получаете доступ к данным. Вы извлекаете данные из таблицы и сохраняете их как объекты в массиве:

class Default_Model_ProductMapper {

    protected $_dbTable;

    public function setDbTable($dbTable) {
        if (is_string ( $dbTable )) {
            $dbTable = new $dbTable ();
        }
        if (! $dbTable instanceof Zend_Db_Table_Abstract) {
            throw new Exception ( 'Invalid table data gateway provided' );
        }
        $this->_dbTable = $dbTable;
        return $this;
    }

    public function getDbTable() {
        if (null === $this->_dbTable) {
            $this->setDbTable ( 'Default_Model_DbTable_Product' );
        }
        return $this->_dbTable;
    }
   //e.g. fetch all
    public function fetchAll() {
        $resultSet = $this->getDbTable ()->fetchAll ();
        $entries = array ();
        foreach ( $resultSet as $row ) {
            $entry = new Default_Model_Product ();
            $entry->setName ( $row->name );
            $entries [] = $entry;
        }
        return $entries;
    }
}

Это очень прямолинейно ;)

person Upvote    schedule 25.03.2011
comment
Вы вообще не упомянули здесь отношения или родственную модель? - person Dunhamzzz; 22.11.2011

Я действительно рекомендую вам использовать другую DB-Framework в вашей MVC-системе.

Zend не очень хорошо работает с базами данных, и это IMO слишком сложно/слишком много кода для написания. Существуют фреймворки, которые очень хорошо работают с Zend (VC), такие как PHPActiveRecord...

--> http://www.phpactiverecord.org/projects/main/wiki/Frameworks< /а>

person riyuk    schedule 12.03.2012