当与 Model 链接的表为非自动增量时,Laravel Model 获取下一个增量 ID

Vic*_*Dev 1 mysql model increment laravel laravel-6

正如我在问题中提到的,我正在处理的当前 Laravel 6.0 项目有一些奇怪的数据库设置,其中模型(此处的 MainModel)MySQL 表已设置为AutoIncrementas NULL。并且客户端根本不允许更改表的定义。

我想在插入记录之前可靠地找到模型的下一个和上一个 ID(因为我无法从表中找到,因为 AutoIncrement 设置为 NULL),以便我可以输入相关记录(例如图像) )首先将主模型的 ID 正确插入到另一个表的参考 ID 字段中,将推荐/常见问题解答或任何所见即所得内容字段)插入到另一个参考表中。

目前我的主模型中有这个,但该next方法不能可靠地一致地返回精确的递增 ID:

<?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;
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏...

mrh*_*rhn 6

据我了解,您对如何调用静态模型查询感到困惑。您可以通过使用静态自引用来实现相同的逻辑static

public static function next()
{
    return static::max('id') + 1;
}
Run Code Online (Sandbox Code Playgroud)

这相当于。

MainModel::max('id');
Run Code Online (Sandbox Code Playgroud)

奖金使其成为一笔交易,以避免 ID 冲突。这可以以有趣的方式锁定数据库,但会避免您拥有相同的 ID,类似于这个,非常简单的示例。

DB::transaction(function () {
    $id= MainModel::next();

    $newModel = MainModel::create(['id' => $id]);
});
Run Code Online (Sandbox Code Playgroud)