Сообщение об ошибке Laravel 7: 'SQLSTATE [23000]: нарушение ограничения целостности: 19 Ошибка ограничения NOT NULL: profiles.url

ОБНОВЛЕНИЕ: ПРОБЛЕМА РЕШЕНА!

Я обновляю свои навыки Laravel (использую версию 7.13.0), следуя руководству freecodecamp.org здесь: https://www.youtube.com/watch?v=ImtZ5yENzgE&t=11889s (с 1:21:49 до 1:22:50). Когда я приступаю к задаче добавления профиля вручную с помощью php artisan tinker, как я делал это во внешнем интерфейсе, он не может сохранить. База данных - sqlite.

ЭТО ПОЛНАЯ ОШИБКА:

Illuminate / Database / QueryException с сообщением 'SQLSTATE [23000]: нарушение ограничения целостности: 19 Ошибка ограничения NOT NULL: profiles.url (SQL: вставить в "profiles" ("title", "description", "user_id", "updated_at" , "created_at") значения (Cool Title, Description, 1, 2020-05-29 18:41:02, 2020-05-29 18:41:02)) '

Моя функция в profiles_table.php в папке database \ migrations выглядит нормально. Вот это:

public function up()
    {
        Schema::create('profiles', function (Blueprint $table) {
            $table->bigIncrements('id');
            $table->unsignedBigInteger('user_id');
            $table->string('title')->nullable();
            $table->text('description')->nullable();
            $table->string('url')->nullable();
            $table->timestamps();

            $table->index('user_id');

        });
    }

Функция Profile.php model:

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

А функция User.php model:

public function profile()
{
    return $this->hasOne(Profile::class);
}

Итак, в терминале, после ввода php artisan tinker, я заполнил следующее, прежде чем он не смог сохранить:

>>> $profile = new \App\Profile();
=> App\Profile {#3056}
>>> $profile->title = 'Cool Title';
=> "Cool Title"
>>> $profile->description = 'Description';
=> "Description"
>>> $profile->user_id = 1;
=> 1
>>> $profile->save();

РЕДАКТИРОВАТЬ: это файл контроллера ProfilesController.php, если он помогает решить проблему:

<?php

namespace App\Http\Controllers;

use \App\User;
use Illuminate\Http\Request;

class ProfilesController extends Controller
{
    public function index($user)
    {
        $user = User::find($user);

        return view('home', [
            'user' => $user,
        ]);
    }
}

Все части прошли нормально, и после того, как я набрал СОХРАНИТЬ, появилась ошибка, указанная выше. Поэтому я не могу продолжать показывать новый профиль, созданный вручную.

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

Что мне делать, чтобы это исправить?

Решение

Соответствует @mrhn, добавляя новую нулевую таблицу + устанавливая composer require doctrine/dbal, как предлагается здесь: https://stackoverflow.com/a/37533819/12952748.


person Yair Shachar    schedule 29.05.2020    source источник
comment
выйдите из tinker, снова перенесите базу данных, снова введите tinker и повторите попытку   -  person Salim Djerbouh    schedule 30.05.2020
comment
Стоит отметить, что с вашим кодом проблем нет, мне не удалось воспроизвести ошибку copy pasta   -  person Salim Djerbouh    schedule 30.05.2020
comment
Попробуйте добавить URL-адрес в заполняемый массив в модели.   -  person Taha Paksu    schedule 30.05.2020
comment
Салим, я проделал выход и снова вошел, ничего не изменилось. Но что значит отсутствие проблем в коде? Где что-нибудь показать? @TahaPaksu куда добавить URL? в профиле контроллера вернуть? Посмотри, я добавил это.   -  person Yair Shachar    schedule 30.05.2020


Ответы (1)


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

В Laravel миграции выполняются только один раз и обеспечивают одинаковую структуру базы данных во всех системах. Чтобы получить поле, допускающее значение NULL, сделайте новую миграцию.

php artisan make:migration url_nullable

Для нового файла миграции добавьте следующую миграцию. Это просто сообщает миграции обновить url до string и nullable.

Schema::table('profiles', function (Blueprint $table) {
    $table->string('url')->nullable()->change();
});

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

php artisan migrate
person mrhn    schedule 29.05.2020
comment
Я добавил новую таблицу с нулевым значением, как вы предложили, но теперь у нее возникли проблемы после ввода php artisan migrate в терминале - из-за существующей таблицы профилей. Когда, если завершится миграция, скажем, говорит: SQLSTATE [HY000]: Общая ошибка: 1 профили таблиц уже существует (SQL: создать профили таблиц (id integer не null автоинкремент первичного ключа, user_id integer не null, заголовок varchar null, текст описания null, url varchar null, created_at datetime null, updated_at datetime null)) - person Yair Shachar; 30.05.2020
comment
Вам нужно выполнить Schema :: table ('profiles'), вы, вероятно, сделали Schema :: create ('profiles'); - person mrhn; 30.05.2020
comment
понял, спасибо вам обоим! Теперь он работает, после установки: composer require doctrine / dbal. Сначала у меня возникла ошибка, и я рекомендую установить его, как он советует здесь: stackoverflow.com/a/37533819/12952748 - person Yair Shachar; 30.05.2020