【问题标题】:How do I create a new row without the table class in the Zend Framework?如何在 Zend 框架中创建没有表类的新行?
【发布时间】:2009-08-03 08:51:18
【问题描述】:

我知道您可以让用户类扩展 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);

【问题讨论】:

    标签: php oop zend-framework zend-db-table


    【解决方案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
    

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

    【讨论】:

      【解决方案2】:

      嗯,有三种选择:

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

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

      $user = new User($userID);
      

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

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

      希望对您有所帮助...

      问候

      back2dos

      【讨论】:

        【解决方案3】:

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

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

        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);
        
            }
        }
        

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

        【讨论】:

          【解决方案4】:
           class User extends UserModel {
          
                  function __construct($userid=NULL){
                     parent::__construct()
          
                     if($userid!=NULL){
                          return $this->find($userid);
                     }else{
                          return $this->createRow();
                     }
                  }
               }
          

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-03-03
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-02
            相关资源
            最近更新 更多