Как создать новую строку без класса таблицы в Zend Framework? - PullRequest
1 голос
/ 03 августа 2009

Я понимаю, что у вас может быть класс Users расширяет Zend_Db_Table_Abstract, а класс User расширяет Zend_Db_Table_Row_Abstract, устанавливая свойство $ _rowClass для Users в User.

Чтобы создать и сохранить новую строку, я знаю, как сделать следующее:

$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 ]

1 голос
/ 06 августа 2009

Вот как создать новый экземпляр строки без объекта 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

Примечание: эти примеры кода не тестируются, я оставлю это вам.

0 голосов
/ 04 августа 2009

Поскольку я не знаю, как работают классы 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);

    }
}

Это неряшливо, но это единственная альтернатива, которую я могу придумать.

0 голосов
/ 05 августа 2009
 class User extends UserModel {

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

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

Но, честно говоря, разница не стоит того.

0 голосов
/ 03 августа 2009

ну, есть три варианта:

  • взломайте это в базовых классах Zend Framework
  • подкласс их для ваших собственных абстрактных базовых классов, чтобы обеспечить эту функцию
  • реализовать это для каждого класса самостоятельно ...

Само собой разумеется, 2-й вариант - самый лучший ... обратите внимание, что это не так круто:

$user = new User($userID);

вам придется каждый раз перенаправлять параметр конструктора в абстрактный суперкласс ... это может быть довольно раздражающим ...

последний вариант, конечно, будет использовать что-то другое, которое уже работает так, как вы это описали, например, motion-twins SPOD , что мне лично больше нравится, потому что это очень легкий, маленький и простой, и поэтому хорошо интегрируется с другими средами, плюс он лучше спроектирован и централизован, а код, который вы пишете с ним, выглядит более интуитивно понятным ... или он может вдохновить вас, как установить Zend Framework для вас так, как вы хотели бы ...

надеюсь, что это поможет ...

Greetz

back2dos

...