Странное поведение доктрины при обновлении - PullRequest
1 голос
/ 05 июня 2010

У меня есть простая таблица, подобная следующей:

class SnookerCurrentInfo extends Doctrine_Record 
{
  public function setTableDefinition() 
  {
    $this->hasColumn('current_frame_id', 'integer', 4, array('notnull' => 'false'));
    $this->hasColumn('current_player_id', 'integer', 4, array('notnull' => 'false'));
    $this->hasColumn('current_score1', 'integer', 4, array('notnull' => 'false'));
    $this->hasColumn('current_score2', 'integer', 4, array('notnull' => 'false'));
  }

  public function setUp()
  {
    $this->setTableName('snooker_current_info');
  }
}

, и я хотел бы сохранить только одну запись в этой таблице.Поэтому каждый раз, когда значение изменяется, я считываю запись с id = 1, изменяю объект и выполняю сохранение.как следующее:

$info = Doctrine::getTable('SnookerCurrentInfo')->find(1);

$info->current_frame_id = $jsonInfo['current_frame_id'];
$info->current_player_id = $jsonInfo['current_player_id'];
$info->current_score1 = $jsonInfo['current_score1'];
$info->current_score2 = $jsonInfo['current_score2'];

$info->save();

но странная вещь, я пытаюсь прояснить это.Скажем, сначала, запись (30, 1, 1, 0), и я переключаю игрока, поэтому обновите запись до (30, 2, 1, 0).и я снова переключаю плеер, поэтому запись должна быть обновлена ​​до (30, 1, 1, 0), , но это не влияет на базу данных !!В базе данных запись все еще остается как (30, 2, 1, 0) !!!!

Но если после (30, 2, 1, 0) я обновлю счет до (30, 2, 1, 1) и затем переключите плеер обратно (30, 1, 1, 1), тогда все в порядке.

Что это?Как мне с этим бороться?

Ответы [ 2 ]

1 голос
/ 08 июля 2012

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

Doctrine 1.x (возможно, также 2.x), похоже, имеет некоторые проблемы с логическими значениями при проверке грязных полей. Прошло много времени с тех пор, как я работал с 1.x, но попытка изменить значение с (int) 1 до 0 не сработала бы, он не распознал бы изменения (что-то в отношении true / false, я думаю). *

В итоге я заменил каждый (int) 0 на (string) 0 перед сохранением изменений.

0 голосов
/ 16 июня 2010

Вы пытались использовать обновление вместо сохранения?

Другой способ, который работает просто как сохранение, но может быть больше, чем вам нужно, это

 $info->replace();

вместо save ();

...