Zend Framework: правильный способ взаимодействия с базой данных? - PullRequest
10 голосов
/ 15 января 2009

Я довольно новичок в Zend Framework и MVC, и меня немного смущает Zend_DB и правильный способ взаимодействия с базой данных.

Я использую адаптер MySQL PDO и создал несколько классов для расширения абстрактных классов:

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
}

Похоже, что существует так много способов доступа к БД (fetchAll (), find (), fetchAll () через адаптер, insert (), createRow () и save (), select () object), которые я всегда нахожу) я возвращаюсь к документам, чтобы выяснить, что мне следует делать.

С.О. научил меня, что готовые операторы - это путь, и я пытался использовать наборы строк и ряды (не так ли?), Но я все еще не понимаю, как лучше взаимодействовать с базой данных?

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

Ответы [ 3 ]

9 голосов
/ 15 января 2009

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

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

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

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

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

8 голосов
/ 15 января 2009

Используя Zend_Db, вы, вероятно, не хотите вдаваться в подробности подготовленных операторов и тому подобного. Вы просто хотите использовать объекты модели для базового CRUD (создание, чтение, обновление и удаление). Я знаю, что Справочное руководство программиста обширное, но это отличное введение в Zend_Db. Возможно, вы захотите поближе взглянуть на документацию Zend_Db_Table .

Но чтобы дать быстрый ответ на ваш вопрос. Если вам не нужно переопределить поведение по умолчанию, вам не нужно расширять Zend_Db_Table_Row_Abstract. Также вы можете, вероятно, упростить класс Users до:

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
}
4 голосов
/ 06 марта 2009

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

//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();

причина, по которой мне больше нравится этот подход, заключается в том, что именно поэтому у вас всегда есть экземпляр пользовательской модели и вы можете иметь в нем пользовательские методы (например, isAdmin), а также потому, что вы можете перезаписать сохранить / вставить / обновить Функция userRow, чтобы сделать что-то, прежде чем они будут вставлены / обновлены.

...