Как обновить продукт в Laravel 5.8

У меня есть продукт, который я хочу отредактировать. См. следующий код.

public function update(ProductRequest $request, Product $product)
{
    $product->user_id = auth()->user()->id;
    $product->title = $request->title;
    $product->body = $request->body;
    $product->price = $request->price;

    if ($request->has('image')) {
        $image = $request->file('image');
        $filename = $image->getClientOriginalName();
        $image->move(public_path('images/products'), $filename);
        $product->image = $request->file('image')->getClientOriginalName();
    }
    $product->update();
    $product->categories()->sync($request->category);

    return redirect()->route('products.index');
}

product.blade.php

<form class = "form-horizontal" action = "{{ route('products.update', $product->id) }}" method = "post" enctype = "multipart/form-data">
{{ csrf_field() }}
{{ method_field('PATCH') }}
.
.
.

Меняется все, кроме изображения. Я пробовал, но у меня не получилось. Какое решение? Я хочу обновить изображение в базе данных.

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

Но это не событие для меня.

я изменил

public function update(ProductRequest $request, Product $product)

К

public function update(Request $request, Product $product)

Вы проверили, что $request->has('image') верно?

Anshul 16.05.2019 06:59

Да, я проверил, что $request->has('image') правда.

user11010133 16.05.2019 07:03

Как вы пытались его отладить? Возвращает ли $request->file('image')->getClientOriginalName(); ожидаемое значение? На первый взгляд кажется, что вы должны использовать save() вместо update()

Jeemusu 16.05.2019 07:15

Я изменил его, но я вижу в базе данных, изображение не изменилось...

user11010133 16.05.2019 07:42

@MahmoudKhosravi Можете ли вы опубликовать шаблон блейда для формы, используемой для загрузки изображений?

Jeemusu 16.05.2019 08:00

@MahmoudKhosravi Я обновил свой ответ. Я предлагаю поставить dd($request->all()) в верхней строке вашего update(...) метода. Опубликуйте форму и проверьте вывод, если файл не включен, измените первый параметр метода обновления с ProductRequest $request на Request $request с помощью Illuminate\Http\Request и повторите попытку. В вашем классе ProductRequest может быть что-то, что вызывает проблему.

Jeemusu 16.05.2019 08:25

Пожалуйста, проверьте этот шаблон. github.com/brnrajoriya/laravel-5-6-crud-операция

Brn.Rajoriya 16.05.2019 11:00
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
1
7
2 461
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

public function update(ProductRequest $request, Product $product)
{
    $product->user_id = auth()->user()->id;
    $product->title = $request->title;
    $product->body = $request->body;
    $product->price = $request->price;
    
    if ($request->has('image')) {
        $image = $request->file('image');
        $filename = $image->getClientOriginalName();
        $image->move(public_path('images/products'), $filename);
        $product->image = $request->file('image')->getClientOriginalName();
    }
    $product->save();
    $product->categories()->sync($request->category);

    return redirect()->route('products.index');
}

Обновление 1

Предполагая, что вы отладили приведенное выше и $request->file('image')->getClientOriginalName() возвращает ожидаемое значение, возможно, вы используете белый список полей в своей модели и не добавили поле изображение в белый список. Убедитесь, что изображение находится в массиве $fillable вашей модели.

class Product extends Model
{
    
    protected $fillable = [
        'user_id',
        'title',
        'body',
        'price',
        ...
        'image'
    ];

Обновление 2

Если $request->file('image') возвращает значение null, это означает, что ваша форма не отправляет файлы. Убедитесь, что ваш элемент <form> имеет атрибут enctype = "multipart/form-data", включенный в тег.


Обновление 3

Если вы уже включили необходимые теги enctype = "multipart/form-data" в элемент <form>, я бы посоветовал сделать следующее.

Поместите dd($request->all()); вверху вашего метода update(ProductRequest $request, Product $product). Отправьте форму и проверьте вывод.

Если файл не включен в вывод, измените использование Запрос Продукта на Запрос $запрос по умолчанию (Illuminate\Http\Request) и повторите попытку. В вашем ProductRequest классе может быть что-то, что вызывает проблему.


В качестве небольшой критики вы можете улучшить свой код следующими способами.

・Используйте hasFile() вместо has().

・Используйте $product-image = $filename вместо $product->image = $request->file('image')->getClientOriginalName();.

public function update(ProductRequest $request, Product $product)
{
    $product->user_id = auth()->user()->id;
    $product->title = $request->title;
    $product->body = $request->body;
    $product->price = $request->price;

    if ($request->hasFile('image')) {
        $image = $request->file('image');
        $filename = $image->getClientOriginalName();
        $image->move(public_path('images/products'), $filename);
        $product->image = $filename;
    }
    
    $product->save();
    $product->categories()->sync($request->category);

    return redirect()->route('products.index');
}

Изображение в базе данных не изменилось.

user11010133 16.05.2019 07:37

@MahmoudKhosravi Вам нужно отладить свой метод построчно, чтобы убедиться, что $image возвращает значение. Возможно ли, что у вас настроен белый список (protected $fillable = [];) для модели продукта и вы не добавили в него поле image?

Jeemusu 16.05.2019 07:39

Я уже добавил Product.php protected $fillable = ['user_id', 'title', 'body', 'image', 'price', 'slug', 'viewCount', 'commentCount'];

user11010133 16.05.2019 07:47

@MahmoudKhosravi В этом случае сбросьте значение имени файла, добавив dd($request->file('image')->getClientOriginalName()); после строки $product->image = ..., чтобы убедиться, что вы действительно получаете ожидаемые данные.

Jeemusu 16.05.2019 07:49

Я получаю эту ошибку. Call to a member function getClientOriginalName() on null

user11010133 16.05.2019 08:01

@MahmoudKhosravi Это предполагает, что ваш файл не отправляется формой. Вы включили enctype = "multipart/form-data" в свой элемент <form>. Это необходимо для размещения файлов через форму.

Jeemusu 16.05.2019 08:04

@MahmoudKhosravi Эффекта не было? Каков результат dd($request->all());?

Jeemusu 16.05.2019 09:52

убедитесь, что у вас есть

enctype = "multipart/form-data"

имущество

Другие вопросы по теме