#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()
метод строки выдаст исключение.