У меня есть продукт, который я хочу отредактировать. См. следующий код.
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') правда.
Как вы пытались его отладить? Возвращает ли $request->file('image')->getClientOriginalName(); ожидаемое значение? На первый взгляд кажется, что вы должны использовать save() вместо update()
Я изменил его, но я вижу в базе данных, изображение не изменилось...
@MahmoudKhosravi Можете ли вы опубликовать шаблон блейда для формы, используемой для загрузки изображений?
@MahmoudKhosravi Я обновил свой ответ. Я предлагаю поставить dd($request->all()) в верхней строке вашего update(...) метода. Опубликуйте форму и проверьте вывод, если файл не включен, измените первый параметр метода обновления с ProductRequest $request на Request $request с помощью Illuminate\Http\Request и повторите попытку. В вашем классе ProductRequest может быть что-то, что вызывает проблему.
Пожалуйста, проверьте этот шаблон. github.com/brnrajoriya/laravel-5-6-crud-операция






Чтобы обновить модель, вы должны получить ее, установить любые атрибуты, которые хотите обновить, а затем вызвать метод сохранения. См. раздел обновлений в файле документация.
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');
}
Предполагая, что вы отладили приведенное выше и $request->file('image')->getClientOriginalName() возвращает ожидаемое значение, возможно, вы используете белый список полей в своей модели и не добавили поле изображение в белый список. Убедитесь, что изображение находится в массиве $fillable вашей модели.
class Product extends Model
{
protected $fillable = [
'user_id',
'title',
'body',
'price',
...
'image'
];
Если $request->file('image') возвращает значение null, это означает, что ваша форма не отправляет файлы. Убедитесь, что ваш элемент <form> имеет атрибут enctype = "multipart/form-data", включенный в тег.
Если вы уже включили необходимые теги 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');
}
Изображение в базе данных не изменилось.
@MahmoudKhosravi Вам нужно отладить свой метод построчно, чтобы убедиться, что $image возвращает значение. Возможно ли, что у вас настроен белый список (protected $fillable = [];) для модели продукта и вы не добавили в него поле image?
Я уже добавил Product.php protected $fillable = ['user_id', 'title', 'body', 'image', 'price', 'slug', 'viewCount', 'commentCount'];
@MahmoudKhosravi В этом случае сбросьте значение имени файла, добавив dd($request->file('image')->getClientOriginalName()); после строки $product->image = ..., чтобы убедиться, что вы действительно получаете ожидаемые данные.
Я получаю эту ошибку. Call to a member function getClientOriginalName() on null
@MahmoudKhosravi Это предполагает, что ваш файл не отправляется формой. Вы включили enctype = "multipart/form-data" в свой элемент <form>. Это необходимо для размещения файлов через форму.
@MahmoudKhosravi Эффекта не было? Каков результат dd($request->all());?
убедитесь, что у вас есть
enctype = "multipart/form-data"
имущество
Вы проверили, что $request->has('image') верно?