варианты Сугубо торт
Есть много способов сделать это ...
Наименьший код инвазивной я думаю, можно было бы добавить проверку в beforeSave
соответствующей модели, что-то вроде
public function beforeSave() {
if (!$this->id && !isset($this->data[$this->alias][$this->primaryKey])) {
// insert
$this->data[$this->alias]['uuid'] = $this->createUUID();
} else {
// edit
// if you don't want to do anything on insert, delete this "else"
}
return true;
}
(этот код был скопирован из here).
Теперь вы не указали подробные сведения о том, что должно быть uuid (целое число, длина, читаемое слово ...). Но давайте предположим, что это простое целое число, если это не так, все изменения нужно сделать здесь. В одной и той же модели, добавить функцию для создания UUID
private function createUUID() {
do {
$uuid = rand(); //any logic you want to create the uuid, a md5, substring, hash...
//check for no repetition
$help = $this->find('first', array('conditions'=>array('uuid'=>$uuid)));
} while(!empty($help));
return $uuid;
}
И таким образом, вы будете иметь уникальный идентификатор UUID, только добавляемые при вставке, без изменения остальной части кода. Это решение, которое мне нравится.
Теперь другим способом сделать это, например, было бы создание функции UUID, которая возвращает значение, и используя его в afterSave
(проверьте, была ли это вставка или обновление) и выполните обновление записи с uuid (к тому времени вы будете иметь идентификатор новой созданной записи).
Существует не так много преимуществ в сравнении с другим ... beforeSave
. Вы можете установить поле uuid в базе данных как NOT NULL, а если вы используете afterSave
, вам нужно сначала вставить запись, а uuid должен быть нулевым для этого.
Без особого подробного описания я рекомендую опцию beforeSave
, только потому, что я от uuid NOT NULL.
thx. Это хороший ответ. Еще один шаг: как я могу легко обновить таблицу (т.е. заполнить вновь добавленное поле)? – Jeroen
Вместо 'rand()' вы можете использовать 'String :: uuid()' http://book.cakephp.org/2.0/en/core-utility-libraries/string.html#String::uuid – Costa
@Costa да, конечно, это был просто пример, так как я не знаю ограничений uuid, но отличный момент. @Jeroen вы можете написать функцию [shell function] (http://book.cakephp.org/2.0/en/console-and-shells.html), которая в основном вызывает 'createUUID()' и редактирует каждую запись, которая не имеет uuid. Это также может быть функцией в модели или действии.Если это только один раз, самый простой вариант будет делать, поскольку вы не будете использовать его в другое время (и, вероятно, удалите его после использования). Если это повторяющаяся вещь (например, раз в месяц), рассмотрите сценарий оболочки или действие контроллера. – Nunser