SQLSTATE[23000]: нарушение ограничения целостности: на Laravel 5

Попытка обновить Профиль пользователя после входа в систему и am имея эту ошибку:

QueryException in Connection.php line 662:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`wallet`.`profiles`, CONSTRAINT `profiles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE) (SQL: insert into `profiles` (`gender`, `city`, `state`, `profession`, `aboutmyself`, `fb`, `twitter`, `gp`, `instagram`, `personal_site`, `aboutme`, `linkedin`, `pinterest`, `updated_at`, `created_at`) values (male, Upper Darby, Washington DC, Architects, Am a Benefactor of Grace and a Heir to the Throne a Royal Priesthood. I Love Jesus! s, url, url, url, url, url, url, hurl, url, 2016-11-05 09:35:51, 2016-11-05 09:35:51))

И ЭТО

PDOException in Connection.php line 390:
SQLSTATE[23000]: Integrity constraint violation: 1452 Cannot add or update a child row: a foreign key constraint fails (`wallet`.`profiles`, CONSTRAINT `profiles_user_id_foreign` FOREIGN KEY (`user_id`) REFERENCES `users` (`id`) ON DELETE CASCADE ON UPDATE CASCADE)

Это означает, что часть кода выполняется сейчас, но что-то о нарушении целостности препятствует сохранению данных.

Контроллер (UserController.РНР)

public function update(Request $request)
{

    $rules = [
        'name' => 'required',
        'email' => 'required',
        'phone' => 'required|numeric',
        'country' => 'required',
        'gender' => 'required',
        'birthday' => 'required',
        'fb' => 'url',
        'twitter' => 'url',
        'gp' => 'url',
        'instagram' => 'url',
        'personal_site' => 'url',
        'aboutme' => 'url',
        'linkedin' => 'url',
        'pinterest' => 'url'

    ];

    $data= $request->all();
    $validator = Validator::make($data, $rules);
    if($validator->fails()){
        return Redirect::back()->withInput()->withErrors($validator);
    }

    $user = Auth::user();

    $user->name = $data['name'];
    $user->email = $data['email'];
    $user->phone = $data['phone'];
    $user->country = $data['country'];
    $user->birthday = $data['birthday'];
    $user->address = $data['address'];
    if($user->save()) {
        $profile_id = $user->id;
        $profile = Profile::findOrFail($user->id);
        if(count($profile) > 0) {
        $profile = new Profile();
        $profile->gender = $data['gender'];
        $profile->city = $data['city'];
        $profile->state = $data['state'];
        $profile->profession = $data['profession'];
        $profile->aboutmyself = $data['aboutmyself'];
        $profile->fb = $data['fb'];
        $profile->twitter = $data['twitter'];
        $profile->gp = $data['gp'];
        $profile->instagram = $data['instagram'];
        $profile->personal_site = $data['personal_site'];
        $profile->aboutme = $data['aboutme'];
        $profile->linkedin = $data['linkedin'];
        $profile->pinterest = $data['pinterest'];
        //$profile = $user->profile()->save($profile);
        $profile->save();   
}
    } else {
        return redirect()->back()->withInput()->withInfo("Something went wrong. Please, try again");
    }
    return redirect()->route('profile')->withSuccess("Your Profile Succesfully Updated.");

}

Миграция пользователей

<?php

use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateUsersTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('users', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->string('login');
            $table->string('email')->nullable();
            $table->string('phone')->nullable();
            $table->string('password', 60);
            $table->string('birthday');
            $table->string('country')->default('AF');
            $table->string('address');
            $table->integer('active')->default(0);
            $table->rememberToken();
            $table->timestamps();
        });
    }

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

Миграция профилей

<?php

use IlluminateDatabaseSchemaBlueprint;
use IlluminateDatabaseMigrationsMigration;

class CreateProfilesTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->increments('id');
            $table->integer('user_id')->unsigned();
            // $table->string('birthday');
            $table->string('aboutmyself');
            $table->string('gender');
            $table->string('age');
            $table->string('propic')->default('uploads/demo.png');
            $table->string('address');
            $table->string('state');
            $table->string('city');
            $table->string('fb');
            $table->string('twitter');
            $table->string('gp');
            $table->string('personal_site');
            $table->string('instagram');
            $table->string('aboutme');
            $table->string('linkedin');
            $table->string('pinterest');

            $table->foreign('user_id')->references('id')->on('users')
                ->onUpdate('cascade')->onDelete('cascade');
            $table->timestamps();
        });
    }

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

2 ответа

  1. Это много кода, чтобы посмотреть, однако, я думаю, что ваша проблема может лежать с $fillableмассивом на вашей Userмодели. Похоже, что вы добавили дополнительные столбцы в таблицу пользователи, не позволяя им быть назначенными массово, поэтому вам нужно убедиться, что вы добавляете их в $fillableмассив как так:

    protected $fillable = ['name', 'login','email', 'password', 'country', 'birthday'...];

    Смотрите: https://laravel.com/docs/5.3/eloquent#mass-assignment

    Вы также должны действительно использовать a FormRequestдля валидатора такого размера, чтобы предотвратить его засорение вашего контроллера:

    https://laravel.com/docs/5.3/validation#form-request-validation

    И вы должны посмотреть, как сохранить отношения:

    https://laravel.com/docs/5.3/eloquent-relationships#inserting-and-updating-related-models

    Вы должны заметить, что eloquentавтоматически сопоставляет входные поля со столбцами базы данных с тем же именем, так что вы действительно должны быть в состоянии разбить этот метод контроллера до нескольких строк кода.

  2. Вы нарушаете контрайнт внешнего ключа. Вы ничего не добавляете в $profile->user_id, и он остается пустым, а ваша база данных запрещает это. Просто добавьте $profile->user_id = $user->id;после $profile = new Profile();и оно должно работать.