2013-08-07 2 views
-1

Я знаю, что получить id из record из db table в CakePHP легко. Я хочу получить «будущее» id «будущего» record таблицы, то есть вставить record, но перед вставкой я хочу получить его id, который будет сгенерирован db после завершения вставки (id - int, Auto Increment). Благодарю.CakePHP, получая идентификатор записи из таблицы db

+1

Почему вы должны знать идентификатор, прежде чем вставить? В этом не должно быть необходимости. Скорее всего, ваши правила кодирования неверны, если вам нужно идентификатор перед вставкой. – BadHorsie

ответ

1

Один из вариантов - вы можете получить текущий максимальный id из mysql, а затем просто увеличить значение. Если у вас много операций, это может вызвать некоторые проблемы с вашим сайтом. Но вы можете использовать:

$this->Model->query("SELECT MAX(id) as max FROM `your_table_name`"); 

Это получит вам максимальный идентификатор этой таблицы в настоящее время, то вы можете сделать +1

Другой вариант должен был бы получить идентификатор после сохранения, а затем обновить запись с этим ID. Например, у cakephp есть метод для этого.

$this->Model->getLastInsertID(); 
$this->Model->updateAll($fields, $conditions) 

Ссылка UpdateAll: http://book.cakephp.org/2.0/en/models/saving-your-data.html#model-updateall-array-fields-array-conditions

+1

SELECT MAX не работает. Что делать, если между запросом времени и временем использования идентификатора вставлено 20 записей? – RichardAtHome

+0

Да, я подумал о первой идее, но я не знал, что это может вызвать некоторые проблемы. Почему это может вызвать проблемы? Вы можете мне объяснить? И, не имеет ли CakePHP какой-либо функции или что-то, что бы дать мне последний идентификатор, перед вставкой? Не поддерживает ли CakePHP такую ​​операцию любым простым способом? @Sixthpoint – user2387319

+0

Как описано ниже, другие операции выполняются до того, как вы используете этот идентификатор, который вы только что вставили. Я не знал контекста, в котором вы использовали бы это. Не совсем лучшая практика для получения идентификатора перед вставкой. Но если у вас не было другого варианта, вы, вероятно, должны заблокировать таблицу, чтобы никаких других транзакций не произошло: http://dev.mysql.com/doc/refman/5.0/en/lock-tables.html – Sixthpoint

4

Даже сама база данных не знает, что ID это будет не использовать до момента после сохранения записи.

Вы не можете (в многопользовательской системе) заранее спросить, что будет с идентификатором, потому что между тем, как вы спросите, каким будет идентификатор, может быть вставлено 20 других записей, а когда вы вставьте свою запись (с идентификатором, который использовался 20 записей назад.) Это называется «Состояние гонки».

Вот что произойдет:

You: DB - what's the next ID please? 
DB: (Does a max() on the column) 21! 
You: Great! I'll use that! 

(meanwhile 20 other records get inserted by other users) 

You: Hi DB, I'd like to insert this record using ID 21 like you told me! 
DB: Oops - sorry - that ID has already been used :'-(

Вам не нужно знать запись заранее. Если вы правильно структурируете данные сохранения и используете метод saveAccociated() CakePHP, CakePHP введет правильный идентификатор в качестве значения внешнего ключа для всех ваших связанных данных.

Единственный способ иметь предсказуемый идентификатор - создать его самостоятельно. Помните - он ДОЛЖЕН быть ненулевым и уникальным (определение первичного ключа).

Сохранить себя много, много будущих столкновений первичных ключей и придерживаться метода торта :-)

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