如何禁用 Laravel eloquent 自动递增?

How to disable Laravel eloquent Auto Increment?

我需要一种有效的方法来禁用 Laravel 自动归咎于我要插入数据的 table 的主键。

为什么?我不检查数据库和插入的数据之间是否有任何重复,所以如果有任何重复,我只是在 try-catch 块中处理它。

问题是,如果有任何失败,Laravel 将其视为我插入了一行。因此 IDs 列不会按此顺序排列 [1、2、3 等],而是按此顺序排列 [1、4、8、20 等]。

我搜索了很多有关此问题的信息,并尝试在 class 声明后使用此行:

public $autoincrement = false;

还有

public $incrementing = false;

但它们不起作用。

我只想使用我数据库的AI。不是 Laravel 的。

尝试public $incrementing = false;

您必须在 table 迁移文件中声明新的主键:

$table->primary('new_key_column');

当然你必须像你一样在你的模型中禁用自动增量。

如果您想使用 non-incrementing or a non-numeric primary key,您必须 set the public $incrementing property 在您的模型上 false

例如:

class UserVerification extends Model
{
    protected $primaryKey = 'your_key_name'; // or null

    public $incrementing = false;
}

在迁移的情况下:

$table->integer('id')->unsigned(); // to remove primary key 
$table->primary('id'); //to add primary key

参考:https://laravel.com/docs/5.3/eloquent#eloquent-model-conventions

您的问题有 2 个解决方案。 正如您所说,第一个是禁用增量列。为此,只需转到您的迁移,然后更改

$table->increment('id)`

$table->integer('id')

它将删除主键,要设置主键,只需转到您的模型文件并添加:

protected $primaryKey = 'column_name';

我更喜欢第二种解决方案。无论何时插入、更新或删除记录,甚至有时读取记录,都使用 laravel 的 DB 事务。这是一个例子:

DB::beginTranscation();
try {
    $model = new Model;
    $model->column_name = $value;
    $model->save();
    DB::commit()
    return;
}
catch(exception $e) {
    DB::rollback();
    return;
}

这种方法比删除自动增量要好。但现在由你来选择了。

您可以执行如下操作

Table:作者

列:id、name、active

class Author extends Model
{
    /**
     * Configure the Model variables
     *
     */
    protected $table = 'author';
    protected $primaryKey = 'id';
    protected $fillable = ['name', 'active']; // eloquent Will use only these columns as you are mentioning them as fillable.

    public static function saveAuthor($data) {
         $author = Author::firstOrNew(['name' => $data['name']]);

            $author->name = $data['name'];
            $author->active = 1;
            $author->save();
    }
}

在 fillable 中,您可以定义要通过模型更改或更新的列。休息字段行为将根据 mysql 定义。

希望对您有所帮助。

抱歉耽误了大家的时间, 问题是,如果我们试图在 MYSQL 中保存任何记录,无论它出于任何原因返回成功还是失败(例如在我的情况下重复),

MYSQL 计算自动增量数已被预订,任何其他即将到来的记录都不会接受它,因为数据库上可能同时有多个插入过程并等待知道如果自动递增号码被预订或不预订将花费MYSQL它的速度。

所以这不是 Laravel 问题,而是 MYSQL 问题。

希望对其他人有所帮助。

谢谢大家...

这是 table 创建其名称 site_rules 的示例,这是迁移文件,我添加了以下行以使 id 成为主 ID 并自动递增
//add this line to make id auto incremented from a specified value DB::statement("ALTER TABLE site_rules AUTO_INCREMENT = 1;"); 这是迁移文件代码:

<?php

 use Illuminate\Support\Facades\Schema;
 use Illuminate\Database\Schema\Blueprint;
 use Illuminate\Database\Migrations\Migration;
class SiteRules extends Migration
{
/**
 * Run the migrations.
 *
 * @return void
 */
public function up()
{
    Schema::create('site_rules', function (Blueprint $table){
        $table->increments('id');
        $table->string('name_ar');
        $table->string('name_en'); 
        $table->timestamps();
    });
    //add this line to make id auto increment from a specified value 
    DB::statement("ALTER TABLE site_rules AUTO_INCREMENT = 1;");
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('site_rules');
}
}

试一试

您可以使用

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->integer('matricule')->unsigned();;
        $table->primary(['matricule']);
        $table->string('nometprenom');
        $table->string('age');
        $table->string('adresse');
        $table->string('telephone');
        $table->string('login');
        $table->string('password');
        $table->string('type');
        $table->engine = 'InnoDB';
        
    });
}

在您的模型中:

public $incrementing = false;

在您的迁移中:

//Remove the default $table->id();

//second param is what auto-increments, default is false so can be skipped
$table->unsignedBigInteger('id', false)->primary(); 

对您在此处看到的所有其他过时或错误解决方案的快速评论:

  • $primaryKey 不需要被覆盖,除非主列不同于 'id'
  • 您不需要使用丑陋的数据库事务来删除自动递增!继续使用可爱的 eloquent 模型,只使用这个答案。