簡體   English   中英

SQLSTATE [23000]:違反完整性約束:在Laravel 5上

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

登錄后嘗試更新用戶配置文件並遇到此錯誤:

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)

意味着現在正在執行CODE的一部分,但是違反Integrity Violation的某些操作會妨礙數據的保存。

控制器 (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');
    }
}

需要檢查很多代碼,但是,我認為您的問題可能出在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自動將輸入字段映射到具有相同名稱的數據庫列,因此您確實應該能夠將該控制器方法分解為幾行代碼。

您違反了外鍵約束。 您無需在$ profile-> user_id中添加任何內容,它保持為空,並且數據庫不允許這樣做。 只需添加$profile->user_id = $user->id; $profile = new Profile(); 它應該工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM