Узнать будущий id
Узнать будущий id
ребят, как узнать какой id (auto increment) получит будущая запись в бд? А также узнать айди только что внесенной записи в бд
Re: Узнать будущий id
id только что вставленной записи можно узнать так .
Узнать id будущей записи на сколько я знаю в Yii нельзя и хорошо что нельзя. Так делать категорически противопоказано, ибо за промежуток времени между тем как узнал будущий id и вставил запись какой-нибудь скрипт может уже произвести запись
Код: Выделить всё
Yii::app()->db->lastInsertID
Узнать id будущей записи на сколько я знаю в Yii нельзя и хорошо что нельзя. Так делать категорически противопоказано, ибо за промежуток времени между тем как узнал будущий id и вставил запись какой-нибудь скрипт может уже произвести запись
Re: Узнать будущий id
ну или так
а в будущее заглядывать имхо нет надобности
Код: Выделить всё
$model = new Model();
$model->name = "test";
$mode->save();
echo $model->id; // "айди только что внесенной записи в бд"
Re: Узнать будущий id
Вообще...
в одноимённом столбце вернёт следующий id-шник..
или так..
Использовать можно, но с умом.
Код: Выделить всё
SHOW TABLE STATUS LIKE 'my_table_name'
Код: Выделить всё
SELECT auto_increment FROM information_schema.tables WHERE table_name='my_table_name'
Использовать можно, но с умом.
...
Re: Узнать будущий id
Лучше все же использовать транзакции...
Другая причина получения нового айдишника идеологически не прокатывает
Другая причина получения нового айдишника идеологически не прокатывает
[Редкие] Записки пещерного человека
Re: Узнать будущий id
Вот таким образом в поведении сохраняю HAS_ONE:
Это верный подход?
Код: Выделить всё
public function beforeSave()
{
$address = $this->getAddress();
$address->save();
$this->getOwner()->address_id = $address->id;
}
Re: Узнать будущий id
так не получиться, как можно узнать ID в методе beforeSave ?Dismal писал(а):Вот таким образом в поведении сохраняю HAS_ONE:
Это верный подход?Код: Выделить всё
public function beforeSave() { $address = $this->getAddress(); $address->save(); $this->getOwner()->address_id = $address->id; }
вам нужно afterSave кроме того
У модели нужно объявить _pk = '???', где ??? -имя ключа, и проследить чтобы елемент первичный ключ был строго равен NULL, иначе ничего $address->id вам не вернет.
Re: Узнать будущий id
kvs1904, это код работающего приложения.
Из API (http://www.yiiframework.com/doc/api/1.1 ... ave-detail):
Из API (http://www.yiiframework.com/doc/api/1.1 ... ave-detail):
* Если PK автоинкремент и не установлен до записи в БД, он будет заполнен автоматически сгенерированным значением.And if its primary key is auto-incremental and is not set before insertion, the primary key will be populated with the automatically generated key value.
Re: Узнать будущий id
1. Приведенные способы для MySQL не корректны, потому что таким образом можно выяснить какой id будет иметь следующая запись, но где гарантия что следующая будет ваша? Гарантированно модно узнать только id уже вставленной.
2. Есть базы, в которых вычисления auto increment полей идет через последовательности, например, Postgres, в таких базах можно запросить следующий id (в Postgres это функция nextval(seq_name)) и тем самым забронировать его номер за своей операцией, после чего это id нужно будет принудительно указать для записи при вставке, иначе при вставке будет сгениророван следующий новый id. Недостаток такого метода в том, что если есть возможность отмены операции, то в последовательности идентификаторов будет дырка, есть системы которым это критично.
В общем рекомендую пользоваться id последней вставленной записи - это правильный и однозначный метод ну и менее трудоемкий в реализации. Я не совсем представляю какая может быть задача чтобы пользоваться вариантом 2 вместо варианта 1.
2. Есть базы, в которых вычисления auto increment полей идет через последовательности, например, Postgres, в таких базах можно запросить следующий id (в Postgres это функция nextval(seq_name)) и тем самым забронировать его номер за своей операцией, после чего это id нужно будет принудительно указать для записи при вставке, иначе при вставке будет сгениророван следующий новый id. Недостаток такого метода в том, что если есть возможность отмены операции, то в последовательности идентификаторов будет дырка, есть системы которым это критично.
В общем рекомендую пользоваться id последней вставленной записи - это правильный и однозначный метод ну и менее трудоемкий в реализации. Я не совсем представляю какая может быть задача чтобы пользоваться вариантом 2 вместо варианта 1.
Re: Узнать будущий id
Корректны-корректны.. вопрос был "какой ID у будущей записи"TM123 писал(а):1. Приведенные способы для MySQL не корректны, потому что таким образом можно выяснить какой id будет иметь следующая запись, но где гарантия что следующая будет ваша? Гарантированно модно узнать только id уже вставленной.
p.s. при особом желании можно и гарантии получить.
p.p.s. Естественно, лучше использовать уже вставленную запись и её ID
...
Re: Узнать будущий id
ого какую бурную дискуссию вызвал такой простой вопрос))
насчет будущих айди- в эту таблицу сохраняю только я, то есть никто явно будущий айди не займет кроме меня. А одно из полей- имя файла, которое есть ид_записи.жпг Вообщем можно сделать и иначе чуть, сохранить сперва а потом апдейтить нужное поле
насчет будущих айди- в эту таблицу сохраняю только я, то есть никто явно будущий айди не займет кроме меня. А одно из полей- имя файла, которое есть ид_записи.жпг Вообщем можно сделать и иначе чуть, сохранить сперва а потом апдейтить нужное поле
Re: Узнать будущий id
То есть вы делаете веб-приложение которым будете пользоваться только вы? Может оно вобще будет не онлайн?phillip писал(а):насчет будущих айди- в эту таблицу сохраняю только я, то есть никто явно будущий айди не займет кроме меня.
Тогда зачем вам вообще нужно это поле? Вы можете всегда выбрать запись и составить имя файла прямо в методе модели, что-то типа:phillip писал(а):А одно из полей- имя файла, которое есть ид_записи.жпг
Код: Выделить всё
public function getImageFile() {
return '/path/to/image/dir/'.$this->id.'.jpg';
}
Re: Узнать будущий id
Ну вообще правильно сначала вставить, потом изменять, а не наоборот, потому что если вставка не пройдет, то у вас разрушится целостность данных и дальше, в зависимости от организации данных, сборщик мусора не сможет обработать корректно ситуацию, когда сначала вставили, потом обновили, в случае вставки без обновления делается простейший сборщик мусора, который трет все что ни с чем не связано. Ну это на случай если БД не поддерживает транзакций, по правильному все это в транзакцию надо оборачивать.
Ну и присоединюсь к замечаниям предыдущего автора, оно у вас не on-line?
Ну и присоединюсь к замечаниям предыдущего автора, оно у вас не on-line?
Re: Узнать будущий id
Код: Выделить всё
оно у вас не on-line?
Код: Выделить всё
Вы можете всегда выбрать запись и составить имя файла прямо в методе модели, что-то типа
Re: Узнать будущий id
Ну хозяин барин, вам конечно виднее.
Re: Узнать будущий id
Лично я в такой ситуации делал так:
брал запросом номер id последней записи в БД. и прибавлял ей единичку.
Это число $new_id = $id+1 я заносил и в БД вместо автоинкримента и именовал так фотки к товару.
Неужели вам не понятно зачем это нужно автору? Что бы выводить картинки товара или статьи под таким же названием как и айдишник товара или статьи.
Ксати супер удобная вещь. У меня так работал каталог на 50тыс товаров. Вывод был безумный. И все работало как часики. Но сделал другой сайт так же и там начались бока с сохранением, так и забросил, впадлу потратить час приходится переименовывать картинки вручную на сервере, что бы с новостями картинки совпадали
брал запросом номер id последней записи в БД. и прибавлял ей единичку.
Это число $new_id = $id+1 я заносил и в БД вместо автоинкримента и именовал так фотки к товару.
Неужели вам не понятно зачем это нужно автору? Что бы выводить картинки товара или статьи под таким же названием как и айдишник товара или статьи.
Ксати супер удобная вещь. У меня так работал каталог на 50тыс товаров. Вывод был безумный. И все работало как часики. Но сделал другой сайт так же и там начались бока с сохранением, так и забросил, впадлу потратить час приходится переименовывать картинки вручную на сервере, что бы с новостями картинки совпадали
Re: Узнать будущий id
Конечно удобная:Puzik писал(а):Ксати супер удобная вещь
Puzik писал(а):приходится переименовывать картинки вручную на сервере
Агрегатор цен на услуги хостинга - https://hostcost.net
Re: Узнать будущий id
Если появляются такие вопросы, то 99,(9)% у тебя что-то не в порядке с архитектурой.phillip писал(а):ребят, как узнать какой id (auto increment) получит будущая запись в бд?
- tsurka
- Сообщения: 222
- Зарегистрирован: 2012.05.07, 17:10
- Откуда: Приднестровье
- Контактная информация:
Re: Узнать будущий id
Давненько мне как-то тоже требовался этот id, на сайте в папке с id статьи лежали ее файлы, фотки и т.д. Я пошел немного другим путем, просто делается папка для админа который добавляет статью и ее файлы, все кидается в его папку, далее после инсерта в табличку, файлики идут уже в папку добавленной статьи. Как-то такphillip писал(а):ребят, как узнать какой id (auto increment) получит будущая запись в бд? А также узнать айди только что внесенной записи в бд
- sluchainiyznak
- Сообщения: 617
- Зарегистрирован: 2013.05.19, 17:51
- Откуда: ХМАО-Югра, г. Сургут
- Контактная информация:
Re: Узнать будущий id
У меня прикрепление файлов к объекту реализовано в afterSave()