Создание пустого Laravel экземпляра модели без атрибутов, но все равно получить идентификатор - PullRequest
1 голос
/ 20 июня 2020

По сути, я создаю экземпляр статьи:

$article = new Article();
//Returns null
$id = $article->id();

Однако он возвращает пустой объект. Что я хотел бы сделать, так это создать статью и получить ее идентификатор перед тем, как сделать:

$article->save();

Попытка создать статью не работает, потому что требует предоставления значений или значений по умолчанию:

$article = Article::create();

Подход, о котором я думаю, работает:

$latest_id = Article::latest()->first()->id;

Но я не уверен, правильный ли он или есть лучший метод.

Ответы [ 3 ]

2 голосов
/ 20 июня 2020

id - это значение столбца id в базе данных, и, поскольку вы еще не сохранили, в базе данных ничего нет (и вы не можете его получить).

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

DB::beginTransaction();

try {
    $article = new Article();
    $article->fields = 'example';
    $article->save();

    // Anything needing ID here...

    DB::commit();
} catch (\Exception $e) {
    DB::rollback();
}
1 голос
/ 20 июня 2020

Вы не можете получить идентификатор объекта / модели, который вы еще не сохранили.

В этом случае идентификатор не существует, вы можете найти последний идентификатор и увеличить этот идентификатор на единицу, но тогда вы могли бы работать в каком-то состоянии гонки, когда другой скрипт, который также добавляет новый элемент в эту таблицу, работает быстрее, тогда у вас неправильный идентификатор, который вы сохраните позже.

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

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

0 голосов
/ 20 июня 2020

Инициализация пустой модели для получения ее идентификатора не поможет, поскольку id всегда вычисляется во время выполнения. Помните, что в систему одновременно может поступать n запросов.

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

Или, если вам нужен только последний идентификатор, который хранится в таблице БД, вы можете сделать это следующим образом, но это может вызвать некоторое несоответствие и несогласованность данных:

$latest_id = Article::latest()->first()->id;

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...