找到多个主键问题Laravel

时间:2016-07-22 12:00:23

标签: php eloquent migration laravel-5.2 primary-key

这是问题所在。我现在正在敲打几个小时。 Laravel不允许我拥有主键(它说多个,但你可以看到它只有一个)。而且因为教师表中的主键存在问题。我无法在课程表中将其用作外键。

教师表的迁移文件

class CreateTeachersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {

        Schema::create('teachers', function (Blueprint $table) {
            $table->increments('teacher_id')->primary();
            $table->string('email', 200);
            $table->string('first_name',300)->nullable();
            $table->string('last_name',300)->nullable();
            $table->string('account_status',50)->default('inactive');
            $table->string('subscription_status',50);
            $table->string('account_reset_code',400)->nullable();
            $table->string('passkey',500);
            $table->timestamps();
        });
    }

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

课程表的迁移文件

class CreateCoursesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
         Schema::create('courses', function (Blueprint $table) {
            $table->increments('course_id')->primary();
            $table->integer('teacher_id_fr');
            $table->string('course_name', 500);
            $table->string('course_code',300);
            $table->string('subject_area',300);
            $table->string('course_level',100);;
            $table->string('grade_periods',100);
            $table->timestamps();    
        });

        Schema::table('courses',function(Blueprint $table){
            $table->foreign('teacher_id_fr')->references('teacher_id')->on('teachers')->onDelete('cascade')->onUpdate('cascade');

        });
    }

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

有关迁移的问题

  

语法错误或访问冲突。 1068找到多个主键

我现在尝试过的事情

1)使用无符号方法使主列无符号。

2)使用表的InnnoDB引擎类型。

3)以及论坛上类似帖子所建议的其他许多内容,但似乎对我没什么用。

修改

我已经从$ table-> increments(' teacher_id')中删除了两个文件中的primary()方法。据说这是Laravel标记自动增加列作为主键。

但是现在错误就在课程表上。

  

常规错误:1215无法添加外键约束

3 个答案:

答案 0 :(得分:0)

您可以在迁移文件中定义Multiple primanry密钥,如下所示:

$table->primary(array('field_name1', 'field_name2'));

答案 1 :(得分:0)

尝试替换此内容,移除primary()increments自动创建primary

 $table->increments('teacher_id')->primary();

$table->increments('teacher_id');

对于新错误,请尝试此General error : 1215 cannot add foreign key constraint

public function up()
{
     Schema::create('courses', function (Blueprint $table) {
        $table->increments('course_id');
        $table->integer('teacher_id_fr');
        $table->string('course_name', 500);
        $table->string('course_code',300);
        $table->string('subject_area',300);
        $table->string('course_level',100);;
        $table->string('grade_periods',100);
        $table->timestamps();    

        $table->foreign('teacher_id_fr')
        ->references('teacher_id')->on('teachers')
        ->onDelete('cascade')
        ->onUpdate('cascade');

    });
}

答案 2 :(得分:0)

我能够通过一分钟的改变来解决这个问题。我修改了下面的课程迁移文件,它就像一个魅力

$table -> integer('teacher_id_fr') -> unsigned();

<强>原因

实际上,引用和引用列(本例中为teacher.teacher_id和course.teacher_id_fr)必须属于同一类型。

话虽如此,Laravel将自动增量列标记为“主要”和无符号类型。因此,请确保更改foregin键列以匹配主键的类型,即unsigned。以上修改的内容。

希望它澄清问题和解决方案。如果您还有其他想法。请在这里试一试。

快乐学习!