Zend Framework:与数据库交互的正确方法?

时间:2009-01-15 02:07:36

标签: php mysql database zend-framework zend-db-table

我是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
}

似乎有很多方法可以访问数据库(fetchAll(),find(),fetchAll()通过适配器,insert(),createRow()和save(),select()对象)我总是找到我回到文档来弄清楚我应该做些什么。

SO告诉我准备好的陈述是要走的路,我一直在尝试使用行集和行(我应该是吗?),但我仍然对最好的交互方式感到困惑与数据库?

(对于非常开放式的问题道歉)

3 个答案:

答案 0 :(得分:9)

通常,人们更喜欢通过Table和Row对象访问数据库,以匹配他们面向对象编程的习惯。

如果您需要编写代码来转换或验证查询输入或输出,则OO方法很有用。您还可以在Table或Row类中编写自定义方法来封装经常需要的查询。

但面向对象的界面已经简化,无法执行您可能需要执行的所有类型的数据库操作。因此,当您需要更好地控制SQL时,可以深入研究Zend_Db_Adapter方法(如query()fetchAll())的SQL查询。

这对于面向对象的数据库接口来说非常常见。可以复制每个 SQL功能的OO层将非常复杂。因此,为了妥协,OO层通常会尝试提供简单的方法来完成最常见的任务,同时让您能够在必要时进行掩护。

这是对你一般性问题的一般回答。

答案 1 :(得分:8)

使用Zend_Db,您可能不想深入了解预准备语句等的详细信息。您只想使用模型对象来执行基本的CRUD(创建,读取,更新和删除)。我知道Programmer's Reference Guide很广泛,但它是对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
}

答案 2 :(得分:4)

我建议使用保存方法。

//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上的函数在插入/更新之前执行某些操作。