Как создать отношение «один ко многим» между двумя таблицами в php Laravel? - PullRequest
0 голосов
/ 15 апреля 2020

Я пытаюсь установить отношение Один ко Многим, например, у меня есть две таблицы Groups и AllotmentApps. Таблица групп имеет только два столбца (GrpId, Name). AllotmentApp имеет много столбцов (Id, StudentName, FatherName и многие другие, включая внешний ключ (GrpId из таблицы групп). Я хочу создать отношение: «У группы есть много или точно 3 приложения, но может принадлежать более одного приложения» тот же GrpId. Я пишу код, но выдает ошибку:

SQLSTATE[HY000]: General error: 1005 Can't create table `has`.`allotmentapps` (errno: 150 "**Foreign key constraint is incorrectly formed")** (SQL: alter table `AllotmentApps` add constraint `allotmentapps_grpid_foreign` foreign key (`grpID`) references `groups` (`id`) on delete cascade)

  at C:\xampp\htdocs\HAS\vendor\laravel\framework\src\Illuminate\Database\Connection.php:669
    665|         // If an exception occurs when attempting to run a query, we'll format the error
    666|         // message to include the bindings with SQL, which will make this exception a
    667|         // lot more helpful to the developer instead of just the database's errors.
    668|         catch (Exception $e) {
  > 669|             throw new QueryException(
    670|                 $query, $this->prepareBindings($bindings), $e
    671|             );
    672|         }
    673|

  **Exception trace:**

  **1**   **PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table `has`.`allotmentapps` (errno: 150 "Foreign key constraint is incorrectly formed")")
      C:\xampp\htdocs\HAS\vendor\laravel\framework\src\Illuminate\Database\Connection.php:463
  2   PDOStatement::execute()
      C:\xampp\htdocs\HAS\vendor\laravel\framework\src\Illuminate\Database\Connection.php:463**

  Please use the argument -v to see more details.

Код таблицы групп:

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateGroupsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('groups', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('name');
            $table->timestamps();
        });
    }

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

Модель группы

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Groups extends Model
{
    //
    public function llotmentApps()
    {
        return $this->hasMany('App\AllotmentApps');
    }
}

Таблица AllotmentApps

<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateAllotmentAppsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('AllotmentApps', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->string('sname');
            $table->string('fname');
            $table->string('Roll_No')->unique();
            $table->string('Department');
            $table->integer('cnic');
            $table->string('domicile');
            $table->double('cgpa');
            $table->string('Session');
            $table->string('degreeProgram');
            $table->integer('contactNo');
            $table->integer('GcontactNo');
            $table->string('preAddress');
            $table->string('permAddress');
            $table->integer('challanNo');
            $table->integer('fee');
            $table->integer('grpID')->unsigned();
            $table->foreign('grpID') ->references('id')->on('groups')->onDelete('cascade')->onupdate('cascade');
            $table->timestamps();
        });
    }

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

Модель выделения

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class AllotmentApps extends Model
{
    //

     public function groups()
    {
        return $this->belongsTo('App\Groups');
    }
}

Где я ошибаюсь, пожалуйста, помогите мне.

Ответы [ 2 ]

0 голосов
/ 15 апреля 2020

Проблема: в качестве внешнего ключа в таблице AllotmentApps используется bigIncrements, представляющий собой UNSIGNED BIGINT в таблице Groups и UNSIGNED INTEGER. Они должны быть одного типа. Вы можете изменить UNSIGNED BIGINT в таблице Groups на UNSIGNED INTEGER или наоборот.

0 голосов
/ 15 апреля 2020

Попробуйте следующий код

public function up()
{
Schema::create('AllotmentApps', function (Blueprint $table) 
{
    $table->unsignedBigInteger('grpID');
    $table->foreign('grpID') ->references('id')->on('groups')- 
    >onupdate('cascade');
});

}

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...