【问题标题】:SQLSTATE[23000]: Integrity constraint violation: on Laravel 5SQLSTATE [23000]:违反完整性约束:在 Laravel 5 上
【发布时间】:2016-11-05 21:26:48
【问题描述】:

登录后尝试更新用户配置文件并出现此错误:

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

}

用户迁移

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

个人资料迁移

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

【问题讨论】:

标签: php laravel


【解决方案1】:

要查看的代码很多,但是,我认为您的问题可能在于您的 User 模型上的 $fillable 数组。看来您已在用户表中添加了额外的列,但不允许对其进行批量分配,因此您需要确保将它们添加到 $fillable 数组中:

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

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

您还应该真正使用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 = new Profile(); 之后添加$profile-&gt;user_id = $user-&gt;id; 即可。

    【讨论】:

      猜你喜欢
      • 2015-07-17
      • 2017-09-11
      • 2021-07-23
      • 1970-01-01
      • 2014-08-18
      • 1970-01-01
      • 2015-03-19
      • 2015-11-27
      相关资源
      最近更新 更多