1

我知道您可以让用户类扩展 Zend_Db_Table_Abstract 和用户类扩展 Zend_Db_Table_Row_Abstract,将用户的 $_rowClass 属性设置为用户。

要创建和保存新行,我只知道如何执行以下操作:

$users = new Users()
$user = $users->createRow();
$user->name = 'name';
$user->save();

你能告诉我我该怎么做吗?

$user = new User();
$user->name = 'name';
$user->save();

作为旁注,我也在考虑尝试使用以下语法来获取特定行:

$user = new User($userID);

然而,鉴于这不是尝试创建新用户而是获取现有用户,我认为以下语法可能更具可读性 - 你怎么看?

$users = new Users();
$user = $users->fetchRow($userID);
4

4 回答 4

1

下面是如何在没有 Table 对象的情况下构造一个新的行实例:

class User extends Zend_Db_Table_Row_Abstract
{
  protected $_tableClass = "Users";
}

$user = new User();
$user->name = "name";
$user->save();  // performs an INSERT

以下是如何在没有 Table 对象的情况下为数据库中的给定行构造行实例:

class User extends Zend_Db_Table_Row_Abstract
{
  protected $_tableClass = "Users";

  public function __construct(array $config = array())
  {
    if (isset($config["key"]) {
      $table = $this->_getTableFromString($this->_tableClass);
      $rowset = call_user_func_array(array($table, "find"), (array) $config["key"]);
      $row = $rowset->current();
      if ($row != false) {
        $config["data"] = $row->toArray();
        $config["stored"] = true;
      }
    }
    parent::__construct($config);
  }
}

$user = new User(array("key"=>$userid));
$user->name = "name";
$user->save(); // performs an UPDATE

注意:这些代码示例未经测试,我将把它留给你。

于 2009-08-05T20:31:43.277 回答
0

由于我不知道 Zend DB Table 类等是如何工作的,我提供了另一种选择:

对于许多不同的课程来说,这很麻烦而且可能需要做太多的工作,但你可以做类似的事情

class User {
    public function __construct($userID) {
        //initialize the db
        $db = Zend_Db::factory(...);

        $sql = $db->quoteInto("select * from users where user_id = ?", $userID);

        $userObject = $db->query($sql)->fetchObject();

        //now $userObject has all the data of that particular user
    }

    public function save() {
        //first gather this user's data into an array, $userData
        //put the user id into $user_id

        $db->update('users', $userData, 'user_id = $user_id);

    }
}

这很草率,但这是我能想出的唯一选择。

于 2009-08-04T07:57:38.750 回答
0

好吧,有三个选项:

  • 将其破解到 zend 框架基类中
  • 将它们子类化为您自己的抽象基类以提供此功能
  • 为每个班级单独实施这个......

不用说,第二个选项是最好的……请注意,这不是很酷:

$user = new User($userID);

您每次都必须将构造函数参数转发给抽象超类......这可能很烦人......

当然,最后一个选择是使用不同的东西,它已经按照您描述的方式工作,例如motion-twins SPOD,我个人更喜欢它,因为它非常轻巧、小巧且简单,因此集成了与其他框架很好,加上它的设计和集中性更好,你用它编写的代码看起来更直观......或者它可以激励你,如何修补 zend 框架以按照你喜欢的方式为你工作......

希望有帮助...

问候

back2dos

于 2009-08-03T09:40:03.140 回答
0
 class User extends UserModel {

        function __construct($userid=NULL){
           parent::__construct()

           if($userid!=NULL){
                return $this->find($userid);
           }else{
                return $this->createRow();
           }
        }
     }

但老实说,这种差异是不值得的。

于 2009-08-05T14:40:58.483 回答