Модель фреймворк Laravel получить следующий код инкремента, если таблица связана с моделью не Автоувеличение

Модель фреймворк Laravel получить следующий код инкремента, если таблица связана с моделью не Автоувеличение

25.06.2020 12:32:17 Источник

Как я уже упоминал в вопросе, текущий проект Laravel 6.0, над которым я работаю, имеет немного странную настройку БД, где таблица MySQL модели(основная модель здесь) была установлена с AutoIncrement как NULL. А клиент вообще не позволит изменить определение таблицы.

Я хочу надежно найти следующий и предыдущий идентификаторы модели(так как я не могу найти из таблицы, так как AutoIncrement имеет значение NULL) перед вставкой записи, чтобы я мог сделать запись соответствующей записи(например. изображение (ы) отзыва/faq или любого поля содержимого WYSIWYG) сначала в другую ссылочную таблицу, правильно вставив идентификатор основной модели в поле refrential ID этой другой таблицы.

В настоящее время у меня есть это в моей основной модели, но метод next не надежно возвращает точный инкрементированный идентификатор последовательно:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Te7aHoudini\LaravelTrix\Traits\HasTrixRichText;

class [MainModel] extends Model
{
    use HasTrixRichText;

    protected $guarded = [];
    public $timestamps = false;
    protected $primaryKey = 'id';
    protected $connection = '[connection1]';
    protected $table = '[main_table]';
    protected $fillable = ['id', '[titlefield]', '[wysiwyg_field]'];

    /**
     *  Setup model event hooks
     */
    public static function boot()
    {
        parent::boot();
        self::creating(function ($model) {
            $model->id = $model->max('id') + 1;
        });
    }

    /**
     * Get next available Faq Id
     */
    public function next()
    {
        return ++$this->id;
    }
}

Любая помощь будет оценена по достоинству...

У вопроса есть решение - Посмотреть?

Ответы - Модель фреймворк Laravel получить следующий код инкремента, если таблица связана с моделью не Автоувеличение / Laravel Model get next increment ID when the Table linked with Model is Non-AutoIncrement

Является ответом!
mrhn

25.06.2020 12:56:02

Как я понимаю, вы путаетесь в том, как вызывать статически модельные запросы. Вы можете достичь той же логики с помощью статической самоссылки static.

public function next()
{
    return static::max('id') + 1;
}

Это было бы равносильно.

MainModel::max('id');

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

DB::transaction(function () {
    $model = MainModel::first();

    $id = $model->next();

    $newModel = MainModel::create(['id' => $id]);
});
Закрыть X