SQLSTATE[23000]: нарушение ограничения целостности: 1048 столбец «изображение» не может быть нулевым

#php #laravel

#php #laravel

Вопрос:

Я борюсь с моей работой над загрузкой файла, который был создан из Laravel. Я следил за некоторыми учебными пособиями на YouTube, но, похоже, я могу развернуть кнопку переключения, когда размер экрана уменьшается до минимального. Поскольку я начинаю новый проект, я применил все это с помощью Laravel и открыл edit.blade.php файл в моем локальном каталоге. Пожалуйста, помогите мне! Я застрял на несколько часов.

миграция

 public function up()
{
    Schema::create('slide_shows', function (Blueprint $table) {
        $table->id();
        $table->bigInteger('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->string('image');
        $table->string('lang');
        $table->timestamps();
    });
}
 

SlideShow.php

 protected $fillable = [
    'user_id',
    'lang',
    'image'
];
 

web.php

 Route::resource('slideShows', 'SlideShowController')

public function update(SlideShowRequest $request, SlideShow $slideShow)
{
    if ($request->hasFile('image'))
    {
        $file = $request->file('image');
        $name = time();
        $extension = $file->getClientOriginalExtension();
        $fileName = $name . '.' . $extension;
        $file->move(public_path('images/slideShows'), $fileName);
    }
    $data = [
        'user_id' => 1, //auth()->id(),
        'image' => $fileName ?? null,
        'lang' => $request->lang
    ];
    $slideShow->update($data);
    return redirect()->route('groups.index');
}
 

edit.blade.php

     <form action="{{ route('slideShows.update', $slideShow->id) }}" method="POST" enctype="multipart/form-data">
        @csrf
        @method('PUT')
        <div lang="row">
            <div class="col-md-6">
                <div class="form-group">
                    <label for="lang">lang</label>
                    <select id="lang" name="lang" class="form-control">
                        <option value="fa" {{ $slideShow->lang == 'fa' ? 'selected' : '' }}>fa</option>
                        <option value="ar" {{ $slideShow->lang == 'ar' ? 'selected' : '' }}>ar</option>
                        <option value="en" {{ $slideShow->lang == 'en' ? 'selected' : '' }}>en</option>
                    </select>
                </div>
            </div>
            <div class="col-md-6">
                <div class="form-group">
                    <label for="image">image</label>
                    <input type="hidden" name="image" value="{{ $slideShow->image == $slideShow->image ? $slideShow->image : '' }}">
                    <input id="image" type="file" name="image" class="form-control">
                </div>
            </div>
        </div>
        <div class="col-md-4">
            <div class="form-group">
                <button type="submit" class="btn btn-success">save</button>
            </div>
        </div>
    </form>
 

Я вижу эту ошибку

SQLSTATE[23000]: нарушение ограничения целостности: 1048 столбец «изображение» не может быть нулевым (SQL: slide_shows набор обновлений image = ?, slide_shows . updated_at = 2021-01-22 15:53:49 где id = 1)

Комментарии:

1. Ваш ответ в вашей ошибке.

2. 'image' => $fileName ?? null, если он не может быть нулевым, не устанавливайте его равным null

3. Каково решение?

4. @MahmoudKhosravi разрешите значение null для столбца изображения в вашей базе данных..

5. @RobinSingh он должен использовать миграции для этого в laravel .. в противном случае при перемещении приложения он снова получит ту же ошибку.

Ответ №1:

Если вы хотите, чтобы столбец был нулевым, вы можете установить его как обнуляемый при миграции:

 $table->string('image')->nullable();
 

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

https://laravel.com/docs/8.x/migrations#updating-column-attributes