Решение "Нарушение ограничения целостности: 19 NOT NULL", какое решение является наиболее правильным? - PullRequest
0 голосов
/ 30 апреля 2020

Попытка написать функцию для создания нового "профиля" в моей таблице профилей и получения следующей ошибки:

"SQLSTATE [23000]: нарушение ограничения целостности: 19 Сбой ограничения NOT NULL: profiles.about (SQL: вставить в значения «profile» («dateofbirth», «state», «zipcode», «profilepi c», «user_id», «updated_at», «creation_at») (2020-04-15, FL, 12345, / tmp / phpTT6CZr, 1, 2020-04-30 00:48:23, 2020-04-30 00:48:23)) "

Я читаю ответы на похожие вопросы за последние несколько часов. Пробовал несколько разных вещей, пока не повезло. Надеюсь увидеть решение, которое работает в моем коде, а также лучше понять, где именно начинается ошибка. Сообщение об ошибке наводит меня на мысль, что это как-то связано с моим разделом «о» в таблице. Но не уверен. Я думал, что добавление «protected $ guarded = [];» к контроллеру решит проблему, но это даст тот же результат.

Вот с чем я работаю:

Файл миграции:

public function up()
{
    Schema::create('profiles', function (Blueprint $table) {
        $table->id();
        $table->unsignedBigInteger('user_id'); //foreign key
        $table->text('about')->nullable;
        $table->text('profilepic')->nullable;
        $table->date('dateofbirth')->nullable;
        $table->unsignedinteger('zipcode')->nullable;
        $table->string('state')->nullable;
        $table->timestamps();

        $table->index('user_id'); //index for foreign key
    });
}

Модель профиля:

class profile extends Model {


protected $guarded = [];


public function user()
{
    return $this->belongsTo(User::class);
} }

Я также пытался изменить модель профиля, как показано ниже:

class profile extends Model {

public function user()
{
    return $this->belongsTo(User::class);
}

/**
 * The attributes that should be cast to native types.
 *
 * @var array
*/

protected $casts = [
    'dateofbirth' => 'datetime',
    'zipcode' => 'unsignedinteger'
];

 /*
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'about','profilepic','state', 'user_id', 'updated_at', 'created_at'
]; }

Они оба выдают одно и то же сообщение об ошибке, но с немного отличающимися значениями массива

Вот моя функция хранения контроллера:

public function store()
{
    $data = request()->validate([
        'dateofbirth' => 'required',
        'state' => 'required',
        'zipcode' => 'required',
        'profilepic' => 'image'
    ]); 

    auth()->user()->profile()->create($data);

    dd(request()->all());
}

Вот вид:

@extends('layouts.app')

@push('styles')
<link href="{{ asset('css/profile.css') }}" rel="stylesheet">
@endpush

@section('content')
{{-- This needs to present a create profile form --}}

<div class="row">
    <h1 class="pl-4">CREATE YOUR PROFILE</h1>
</div>

<form action="/profile" class="pl-4" enctype="multipart/form-data" method="post">
    @csrf

    <div class="form-group row">
        <label for="profilepic"
        class="col-md-4 ocl-form-label"
        >Upload a Profile Picture</label>

        <input type="file"
        class="form-control-file"
        id="profilepic"
        name="profilepic">
    </div>

    <div class="form-group">
        <label for="about">Write your "About" Section here. What do you want us to know about you?</label>
        <textarea type="text" class="form-control" id="about" name="about" rows="3"></textarea>
    </div>

    <div class="form-group">
        <label for="dateofbirth">Date of Birth</label>

        <input type="date"
        id="dateofbirth"
        name="dateofbirth">
    </div>

    <div class="form-group">
        <label for="zipcode">Zipcode</label>
        <input type="text" id="zipcode" name="zipcode">
    </div>

    <div class="form-group">
        <label for="State">State</label>
        <input type="text" id="state" name="state">
    </div>

    <div class="form-group row pt-4">
        <button class="btn btn-primary">Submit</button>
    </div>
</form> @endsection

Ответы [ 2 ]

0 голосов
/ 01 мая 2020

Я также добавлю, с тех пор я решил эту проблему путем реализации ответа @ djunehor. Но одной вещью, которая помогла решить проблему, было добавление этого к контроллеру:

public function store(Request $request)

Сначала я не передавал запрос и не сохранял его в такой переменной, но этот шаг, похоже, сделал большую разницу для ошибок, с которыми я столкнулся.

Сначала я просто делал это:

public function store()
0 голосов
/ 30 апреля 2020

Эта ошибка означает, что вы пытаетесь установить столбец внешнего ключа как ноль, что недопустимо, в данном случае, user_id в таблице profiles. Попытайтесь изменить свой код следующим образом: в вашей модели профиля добавьте столбцы массового назначения:

protected $fillable = ['dateofbirth', 'state', 'zipcode', 'profilepic'];

В методе хранилища вашего контроллера:

//assuming the route method is authenticated such that there's always a logged in user
$user = auth()->user();
$data['user_id'] = $user->id;
$profile = Profile::create($data);
...