Zend_Db_Table_Row: почему я должен использовать createRow()?

#zend-framework #zend-db #zend-db-table

#zend-framework #zend-db #zend-db-table

Вопрос:

Мне интересно, почему в Zend_Db вы должны использовать метод createRow для получения нового, пустого объекта Row, а не просто создавать экземпляр объекта Row напрямую.

Например, если я расширил классы по умолчанию, чтобы создать свои собственные классы пользовательских таблиц и строк, то для создания нового объекта row мне всегда нужно делать следующее, чтобы создать новый объект Row:

 $userTable = new App_Table_User();
$userRow = $userTable->createRow();
$userRow->setName('bob');
$userRow->save();
  

Но для меня имеет больше смысла иметь возможность просто сказать:

 $userRow = new App_Row_User();
$userRow->setName('bob');
$userRow->save();
  

Я понимаю, что я всегда могу встроить эту функциональность в свои расширяемые классы строк Zend_Db_Table_Row_Abstract , но мне интересно, есть ли конкретная причина, по которой команда Zend Framework просто не сделала это по умолчанию?

Ответ №1:

Вы можете создать экземпляр своего класса Row напрямую с new помощью .

Но объекту Row необходимо знать, какие столбцы допустимы для этой строки данных.

Нет никакого волшебства для сопоставления имени класса строки с соответствующим именем класса таблицы. Таким образом, строка сама по себе не знает, к какой таблице она принадлежит. Поэтому он не может угадать, как написать SQL для выполнения операций вставки или обновления; он получает эти метаданные из соответствующего объекта Zend_Db_Table. Вы должны указать строке, какую таблицу использовать.

Если вы создаете объект row с new помощью , вы должны передать конструктору конфигурационный массив, включающий либо имя класса table, либо экземпляр объекта этого класса table.

 $userRow = new App_Row_User( array('table' => 'App_Table_User') );
  

Или

 $userTable = new App_Table_User();
$userRow = new App_Row_User( array('table' => $userTable) );
  

Без допустимого табличного объекта или имени класса создание экземпляра объекта Row с new помощью вызовет исключение.

Аналогично, save() использует объект таблицы, вызывая методы insert() или update() . Без допустимого объекта таблицы save() метод строки выдаст исключение.