如何禁用Laravel eloquent Auto Increment?

时间:2017-07-27 12:54:24

标签: php laravel eloquent

我需要一种有效的方法来禁止Laravel自动输入我要插入数据的表的主键。

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

问题是如果有任何失败Laravel计算它就像我插入了一行。因此,ID列不会按此顺序[1,2,3等],但在此[1,4,8,20等]中。

我搜索了很多关于这个问题的内容,并且在声明类之后我试图使用这一行:

public $autoincrement = false;

另外

public $incrementing = false;

但他们没有工作。

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

9 个答案:

答案 0 :(得分:15)

如果您希望使用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

答案 1 :(得分:2)

尝试public $incrementing = false;

答案 2 :(得分:0)

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

$table->primary('new_key_column');

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

答案 3 :(得分:0)

您的问题有两种解决方案。 首先,正如您所说,禁用增量列。要做到这一点,只需转到您的迁移,然后更改

$table->increment('id)`

$table->integer('id')

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

protected $primaryKey = 'column_name';

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

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

这种方法比删除自动增量更好。但是现在你可以选择。

答案 4 :(得分:0)

您可以执行以下操作

表:作者

列: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定义。

我希望这会对你有所帮助。

答案 5 :(得分:0)

这是表创建其名称site_rules的示例,这是我添加以下行以使id为primary并自动递增的迁移文件         //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');
}
}

试试吧

答案 6 :(得分:0)

您可以使用

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';
        
    });
}

答案 7 :(得分:0)

在您的模型中:

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' 不同
  • 你不需要使用丑陋的数据库事务来移除自动递增!继续使用可爱的雄辩模型,只需使用这个答案。

答案 8 :(得分:-1)

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

MYSQL计算自动增量编号已被预订,而任何其他即将到来的记录都不会被记录,因为在同一时间内DB上可能存在多个插入过程并等待知道自动增量编号是否为预订与否将使MYSQL的成本降低。

所以它不是Laravel问题,它是MYSQL问题。

我希望它可以帮助别人。

谢谢大家...