2013-07-19 1 views
2

Я использую CakePHP 1.3, и я вставляю новые записи (несколько тысяч) в цикл, если он является новым или обновляет существующие записи, если они уже существуют. Но способ, которым я сохраняю, не проверяет, существует ли уже запись; вместо этого я назначаю значение первичного ключа в каждой из записей. Этот идентификатор, который я назначаю, гарантированно будет уникальным. CakePHP, похоже, знает, что нужно вставить, если этот идентификатор не существует и обновляется в противном случае.CakePHP 1.3: правильный способ вставки или обновления записей

Однако я не уверен, что я делаю это правильно. Я читаю here, если я создаю новую запись в цикле, мне нужно сделать $this->create(), который я реализую в других функциях, где я знаю, что каждая запись будет уникальной. Я не делаю этого здесь, потому что он, кажется, работает без ошибок, и мне не нужно тогда проверять наличие каждого из записей.

Каждый из массива записей, который я вставляю или обновляю, имеет ключ id, который указывает первичный ключ в соответствующих таблицах, и каждый массив содержит данные для двух соответствующих моделей.

например.

$this->saveAll($myData); 

Array 
(
    [MyModel] => Array 
    (
     [id] => 123 
     [xyz] => ... 
     ... 
    ) 
    [MySecondModel] => Array 
    (
     [id] => 789 
     [my_model_id] => 123 
     [qwe] => ... 
     ... 
    ) 
) 

Это то, что я делаю хорошо, или мне нужно сделать, чтобы проверить наличие последующей $this->create(), в случае необходимости?

ответ

2

Если вы включите отладку SQL, вы увидите, что Cake извлекает запись из базы данных, если вы указываете ID до save(). Если запись существует, Cake будет выполнять обновление, иначе вставить; указание NULL для идентификатора принудительно вставляет. Так что вы делаете хорошо.

create() важен, если вы не заполняете все столбцы; в противном случае данные останутся в объекте, и вы в конечном итоге проливаете данные из одной записи в другую. create просто сбрасывает внутреннюю структуру данных.

Вам не нужно проверять наличие данных после save(), если только вы не параноик. Однако do проверить результат с save(); если он возвращает false, что-то пошло не так.

+0

Не могли бы вы подробнее рассказать о части «проливных данных»? Мои массивы данных не обязательно имеют все указанные столбцы. Может быть, пример? – musicliftsme

+0

Под «проливными данными» я имею в виду следующее: предположим, что вы обновили запись со значением «foo» для столбца «bar». В следующем цикле вы создаете новую запись, но не вызываете create() или не устанавливаете «bar»; в этом случае ваша новая запись также будет иметь «foo» в этом столбце. Что-то вы, возможно, не захотите. Поэтому рекомендуется каждый раз создавать create(). – JvO

 Смежные вопросы

  • Нет связанных вопросов^_^