Сохранение строки после заполнения из Array - Zend - PullRequest
0 голосов
/ 07 октября 2009

Еще раз вопрос Zend Framework! Любая помощь приветствуется.

У меня есть класс таблицы БД, который я хочу использовать для вставки / обновления строк при публикации формы, и я хотел бы использовать метод save (), чтобы он мог проходить через один и тот же метод.

<code>
//Users Db Table class
class <code>DBTables_Users</code> extends <code>Zend_Db_Table_Abstract</code>
{
    protected <code>$_name</code> = "users";
    protected <code>$_primary</code> = "userID";
}

Так вот мой тестовый код ...

<code>
$userArray = array( 'userID' => 1,
      'firstName' => 'Test',
      'lastName' => 'Test',
      'emailAddress' => 'test@hotmail.com'
      );</p>

<p>$user = new DBTables_Users();</p>

<p>$newUserRow = $user->createRow($userArray);</p>

<p>$newUserRow->save();

Это прекрасно работает без элемента "userID" и вставляется нормально, но если я добавлю его, он попытается вставить его снова и выдает ошибку с повторяющимся ключом.

Для меня строка должна подтвердить наличие первичного ключа и использовать его в качестве предложения where для обновления строки. Однако после углубления в код, единственное, что он проверяет, чтобы определить, является ли он вставкой или обновлением, это наличие переменной «_cleanData», которая заполняется при построении, если в конфигурации есть опция «data», которой нет при использовании метод createRow.

Я поступаю об этом неправильно или нужно некрасивое исправление установки свойства _cleanData самостоятельно в переопределении?

Приветствие Стюарт

Ответы [ 2 ]

2 голосов
/ 08 октября 2009

Конечно, если запись новая, у вас не будет идентификатора, передаваемого из вашей формы?

Разве вы не можете быстро проверить, является ли оно пустым или пустым, а затем вызвать вставку, а не обновление?

Не пытайтесь делать слишком много вещей одним методом, если они выполняют другую задачу, отделяют их.

Вот пример моих методов вставки / обновления, расположенных в классе, который расширяет Zend_Db_Table (Zend Framework 1.8)

public function insertQuote($quote)
    {
        $data = array('id'=>null,'quote'=>$quote, 'dateCreated'=>NOW());
        $id = $this->insert($data);

        return $id;
    }

public function updateQuote($id, $quote)
    {
        $data = array(
        'quote'=>$quote
        );
        $this->update($data, 'id = ' . (int)$id);
    }
0 голосов
/ 07 октября 2009

Такое изменение сделает невозможным вставку строки с указанным пользователем первичным ключом (например, естественными первичными ключами, предварительно извлеченными из последовательности). Он не может предполагать, что таблица уже содержит строку, только на основании того факта, что массив содержит первичный ключ.

Вы можете написать новую функцию, аналогичную createRow, которая создает экземпляр строки с 'stored' => true.

...