【发布时间】:2020-10-15 06:20:53
【问题描述】:
正如我在问题中提到的,我正在处理的当前 Laravel 6.0 项目有一些奇怪的数据库设置,其中模型(此处为 MainModel)MySQL 表已设置为 AutoIncrement 为 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;
}
}
感谢任何帮助...
【问题讨论】:
-
嗯...正在写一个答案,但很困惑为什么 next 有这个逻辑而不是重用引导方法的方法?
-
在插入之前没有可靠的方法来执行此操作,因为在识别和检索之间可能会发生竞争条件。
SELECT MAX(..) ... LOCK IN SHARE MODE、INSERT在同一事务中可能会取得一些成功。循环执行此操作以确保成功。向客户展示这一点,也许他们会看到原因并允许 AUTOINCREMENT 字段做他们想要做的事情。如果他们不这样做,请重新考虑是什么让作为客户有价值。 -
@mrhn 因为当我看到
boot方法时,$model不是直接用在方法中而是在self::creating(function())方法中使用,你注意到了吗?所以我很困惑,我怎样才能在next方法中获得$model->id?我不认为$model在扩展MainModel中直接可用,是吗?
标签: mysql laravel model increment laravel-6