SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку:

Я получаю эту ошибку при сохранении модели с отношением многие ко многим (группа и члены). SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполнено (_1 _._ 2_, CONSTRAINT group_user_group_id_foreign FOREIGN KEY (group_id) ССЫЛКИ groups (id) ON DELETE CASCADE

и несколько раз при вставке значений в таблицу отношений: SQLSTATE [23000]: нарушение ограничения целостности: 1452 Невозможно добавить или обновить дочернюю строку: ограничение внешнего ключа не выполняется (_7 _._ 8_, CONSTRAINT group_user_group_id_foreign FOREIGN KEY (group_id) ССЫЛКИ groups (id) ПРИ КАСКАДЕ УДАЛЕНИЯ ПРИ КАСКАДЕ ОБНОВЛЕНИЯ) (SQL: вставить в group_user (group_id, user_id) значения (1, 4), (2, 4), (3, 4))

Обратите внимание, что столбцы перевернуты (group_id, user_id). В этом примере значения 4 должны быть для столбца group_id.

Вот мой код: User.php

<?php

namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable
{
    use HasFactory, Notifiable;
/**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'username',
        'email',
        'password',
    ];

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];
    
    public function groups() {
        return $this->belongsToMany(
            Group::class,
            'group_user',
            'group_id',
            'user_id'
        );
    }

public function propulsedGroups() {
        return $this->hasMany(Group::class);
    }
}

Group.php

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Group extends Model
{
    use HasFactory;

    protected $table    = 'groups';
    protected $fillable = [
        'logo',
        'name',
        'description',
        'propulser_id'
    ];

    public function users() {
        return $this->belongsToMany(
            User::class,
            'group_user',
            'user_id',
            'group_id'
        );
    }

public function propulser() {
        return $this->belongsTo(User::class, 'propulser_id');
    }

}

users_table

<?php

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

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id')->unsigned();
            $table->string('username')->unique();
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->string('code')->unique();
            $table->enum('status', ['active', 'blocked', 'desactivated']);
            $table->enum('type', ['member', 'propulser'])->default('member');
            $table->rememberToken();
            $table->timestamps();
        });
    }

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

groups_table

<?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->increments('id')->unsigned();
            $table->string('name');
            $table->longText('description');
            $table->string('logo')->nullable();
            //$table->string('cover')->nullable();
            $table->string('code')->unique();
            $table->integer('propulser_id')->unsigned();
            $table->foreign('propulser_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->timestamps();
        });
    }

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

group_user_table

<?php

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

class GroupUser extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('group_user', function (Blueprint $table)
        {
            $table->increments('id')->unsigned();
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->integer('group_id')->unsigned();
            $table->foreign('group_id')->references('id')->on('groups')
                ->onUpdate('cascade')->onDelete('cascade');

        });
    }

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

Хранение функций GroupsController.php ()

/**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */
    public function store(Request $request)
    {
        $this->validate($request, [
            'name'          => 'required',
            'description'   => 'required',
            'logo'   => validate_image(),
            'propulser_id' => '',
            'members'   => ''
        ], [], [
            'name'      => 'Name',
            'description'     => 'Description',
            'logo'  => 'Logo',
            'propulser_id' => 'Propulser',
            'members'   => 'members'
        ]);

        $letter = chr(rand(65,90));

        $code = IdGenerator::generate(['table' => 'users', 'field' => 'code', 'length' => 10, 'prefix' => $letter]);

        $group = new Group;
        $group->code = $code;
        $group->name = $request->name;
        $group->description = $request->description;
        $group->propulser_id = $request->propulser_id;
        if (request()->hasFile('logo')) {
            $group->logo = Up::upload([
                'new_name'      => 'group',
                'file'          => 'logo',
                'path'          => 'groups',
                'upload_type'   => 'single',
                'delete_file'   => Group::find($request->id) != null ? Group::find($request->id)->logo : ''
                ]);
            }

            $user = User::find($request->propulser_id);
            $user->type = "propulser";
            $user->save();

            $group->save();

            $group->users()->attach($request->members);

        session()->flash('success', 'Added successfully');
        return redirect(aurl('groups'));
}

Создать представление группы:

<section id="create-group">
    <div class="card">
        <div class="card-header"><i class="fa fa-align-justify"></i> {!! $title !!}</div>
        <div class="card-body">
            {!! Form::open(['url' => aurl('groups'), 'files' => true]) !!}
            <div class="form-group">
                <div class="avatar-upload">
                    <div class="avatar-edit">
                        {!! Form::file('logo', ['class'=>'form-control', 'id' => 'imageUpload']) !!}
                        <label for="imageUpload"><i class="fas fa-pencil-alt"></i></label>
                    </div>
                    <div class="avatar-preview">
                        <div id="imagePreview" style="background-image: url(http://i.pravatar.cc/500?img=7);">
                        </div>
                    </div>
                </div>
            </div>
            <div class="form-group">
                {!! Form::label('name', 'Group name') !!}
                {!! Form::text('name', old('name'), ['class' => 'form-control']) !!}
            </div>
            <div class="form-group">
                {!! Form::label('description', 'Group description') !!}
                {!! Form::textarea('description', old('description'), ['class' => 'form-control']) !!}
            </div>
            <div class="form-group">
                {!! Form::label('propulser_id_id', 'propulser') !!}
                {!! Form::select('propulser_id', $users, old('propulser_id'),['class' => 'form-control']) !!}
            </div>

               <div class="form-group">
                {!! Form::label('members', 'Members') !!}
                {!! Form::select('members[]', $users, old('members'),['multiple' => 'multiple','class' => 'js-example-basic-multiple form-control']) !!}
               </div>

            {!! Form::submit('Create', ['class' => 'btn btn-primary']) !!}
            {!! Form::close() !!}
        </div>
      </div>
</section>

Надеюсь, кто-то может помочь. Заранее спасибо.


person jakpro    schedule 01.11.2020    source источник


Ответы (2)


Я починил это.

Проблема заключалась в том, что я должен был сделать group_id перед user_id в модели Group.php

        return $this->belongsToMany(
            User::class,
            'group_user',
            'group_id'
            'user_id',
        );
    }```
person jakpro    schedule 01.11.2020

в моем случае я изменил тип group_id на 'string'. Добавьте свойство в модель группы, например:

public $incrementing = false;
protected $keyType = 'string';
person cpy ultra    schedule 15.07.2021