简体   繁体   中英

SQLSTATE[23000]: Integrity constraint violation: on Laravel 5

Trying to Update user Profile after Login and am having this ERROR:

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))

AND THIS

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)

Meaning that part of the CODE is executing now but something on Integrity Violation is hindering the data from being saved.

CONTROLLER (UserController.php)

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.");

}

USER Migration

<?php

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

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

PROFILE Migration

<?php

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

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

It's a lot of code to look through, however, I think your issue may lie with the $fillable array on your User model. It appears that you have added extra columns to you users table without allowing them to be mass assigned, so you need to make sure you add them to the $fillable array as so:

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

See: https://laravel.com/docs/5.3/eloquent#mass-assignment

You should also really be using a FormRequest for a validator that size to prevent it from clogging up your controller:

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

And you should look at how to save relationships:

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

You should note that eloquent automatically maps your input fields to database columns with the same name so you should really be able to break that controller method down to just a few lines of code.

You violate foreign key contraint. You don't add anything to $profile->user_id and it stays null and your database disallows that. Simply add $profile->user_id = $user->id; after $profile = new Profile(); and it should work.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM