Zend_Db_Table_Row: Почему я должен использовать createRow ()? - PullRequest
4 голосов
/ 18 октября 2011

Мне интересно, почему в Zend_Db вы должны использовать метод createRow для получения нового пустого объекта 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();

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

1 Ответ

4 голосов
/ 18 октября 2011

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

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

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

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

$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().Без действительного табличного объекта метод Row save() сгенерирует исключение.

...