Zend Framework: правильный способ взаимодействия с базой данных?

Я новичок в 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 научил меня, что готовые заявления - это путь, и я пытаюсь использовать ряды и строку (должен ли я быть?), но я все еще путаюсь в отношении , что лучший способ взаимодействия с базой данных?

(извинения за ужасно открытый вопрос)

Ответ 1

Используя 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
}

Ответ 2

В общем, люди предпочитают обращаться к базе данных через объекты Table и Row, чтобы соответствовать их обычаям объектно-ориентированного программирования.

Подход OO полезен, если вам нужно написать код для преобразования или проверки ввода или вывода запросов. Вы также можете создавать собственные методы в классе Table или Row для инкапсуляции часто требуемых запросов.

Но объектно-ориентированный интерфейс упрощен, он не может выполнять все типы операций с базой данных, которые вам могут понадобиться. Таким образом, вы можете глубже изучить и запустить SQL-запрос против методов Zend_Db_Adapter, таких как query() и fetchAll(), когда вам нужен более тонкий контроль над вашим SQL.

Это довольно распространено для объектно-ориентированных интерфейсов к базам данных. Уровень OO, который может дублировать каждую функцию SQL, будет безумно сложным. Таким образом, для компрометации слой OO обычно пытается обеспечить простые способы выполнения наиболее часто встречающихся задач, одновременно предоставляя вам возможность подходить под обложки, когда это необходимо.

Это очень общий ответ на ваш общий вопрос.

Ответ 3

Я рекомендую использовать метод сохранения.

//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), а также потому, что вы можете оверить сохранение/вставку/обновление на userRow, чтобы что-то сделать, прежде чем они будут вставлены/обновлены.