Я довольно новичок в Zend Framework и MVC, и я немного смущен Zend_DB и правильный способ взаимодействия с базой данных.
Я использую адаптер PDO MySQL и создал несколько классов для расширения абстрактных классов:
class Users extends Zend_Db_Table_Abstract { protected $_name = 'users'; protected $_primary = 'user_id'; protected $_rowClass = 'User'; public function getUserbyID($id) { /* code */ } // More code here } class User extends Zend_Db_Table_Row_Abstract { // Code here } class Widgets extends Zend_Db_Table_Abstract { protected $_name = 'widgets'; protected $_rowClass = 'Widget'; public function getWidgetsfromUser($userid) { /* code */ } // More code here } class User extends Zend_Db_Table_Row_Abstract { public function doSomethingWithWidget() { /* code */ } // More code here }
Кажется, существует так много способов доступа к DB (fetchAll (), find (), fetchAll () через адаптер, insert (), createRow () и save (), select () объект), которые я всегда нахожу назад к документам, чтобы выяснить, что я должен делать.
SO научил меня, что готовые заявления – это путь, и я пытался использовать ряды и строку (должен ли я быть?), Но я все еще запутался относительно того, как лучше всего взаимодействовать с базой данных?
(извинения за ужасно открытый вопрос)
Используя Zend_Db, вы, вероятно, не хотите вдаваться в детали подготовленных операторов и тому подобное. Вы просто хотите использовать объекты модели для выполнения базового CRUD (создание, чтение, обновление и удаление). Я знаю, что справочное руководство программиста обширно, но это отличное введение в Zend_Db. Вы можете более подробно ознакомиться с документацией Zend_Db_Table .
Но чтобы быстро ответить на ваш вопрос. Если вам не нужно переопределять поведение по умолчанию, вам не нужно расширять Zend_Db_Table_Row_Abstract. Также вы можете упростить класс «Пользователи»:
class Users extends Zend_Db_Table_Abstract { protected $_name = 'users'; // Code here }
Затем, чтобы использовать его, вы могли бы сделать некоторые из вещей, о которых вы говорили, используя следующее:
//Create a Users Model Object $usersDb = new Users(); //Find the record with user_id = 4 and print out their name $row = $usersDb->find(4); echo $row->first_name . ' ' . $row->last_name //Change the first name of this user to Brian $row->first_name = 'Brian'; $row->update(); //Insert a user into the database $data = array( 'first_name' => 'Gilean', 'last_name' => 'Smith'); $usersDb->insert($data); //Retrieve all users with the last name smith and print out their full names $rows = $usersDb->fetchAll($usersDb->select()->where('last_name = ?', 'smith')); foreach ($rows as $row) { echo $row->first_name . ' ' . $row->last_name }
В общем, люди предпочитают обращаться к базе данных через объекты Table и Row, чтобы соответствовать их привычкам объектно-ориентированного программирования.
Подход OO полезен, если вам нужно написать код для преобразования или проверки входов или выходов запроса. Вы также можете писать собственные методы в классе Table или Row для инкапсуляции часто требуемых запросов.
Но объектно-ориентированный интерфейс упрощен, не в состоянии выполнить все типы операций с базой данных, которые вам могут потребоваться. Таким образом, вы можете глубже изучить и запустить SQL-запрос против методов Zend_Db_Adapter, таких как query()
и fetchAll()
когда вам нужен более тонкий контроль над вашим SQL.
Это довольно распространено для объектно-ориентированных интерфейсов к базам данных. Уровень OO, который может дублировать каждую функцию SQL, будет безумно сложным. Чтобы скомпрометировать, уровень OO обычно пытается обеспечить простые способы выполнения наиболее общих задач, одновременно предоставляя вам возможность подходить под обложки, когда это необходимо.
Это очень общий ответ на ваш очень общий вопрос.
Я рекомендую использовать метод save.
//Create a Users Model Object $usersDb = new Users(); //Find the record with user_id = 4 and print out their name $row = $usersDb->find(4); echo $row->first_name . ' ' . $row->last_name //Change the first name of this user to Brian $row->first_name = 'Brian'; $row->save(); //Insert a user into the database $newUser = $usersDb->fetchNew(); $newUser->first_name = 'Gilean'; $newuser->last_name = 'Smith'; $newUser->save(); // OR if you get your data from post or any array $newUser = $usersDb->fetchNew(); $newUser->setFromArray($data_from_post); $newUser->save();
причина, почему мне нравится этот подход больше, потому что это потому, что у вас всегда есть экземпляр модели пользователя, и у вас могут быть собственные методы (ex isAdmin), а также потому, что вы можете оверить функцию save / insert / update на userRow что-то сделать, прежде чем они будут вставлены / обновлены.