Обновите, не выбирая изображение, получите ошибку (Laravel)

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

но если я не выбираю изображение, выдает ошибку $imageName

     $request->validate([
            'type'      => 'required',
            'title'     => 'required',
            'body'      => 'required',
            'excerpt'   => 'required',
            'tag'       => 'required',
            'metas'     => 'required',
            'ispublished'     => 'required',
        ]);
        if ($request->hasFile('image')) 
        {
                request()->validate(['image' => 'file|image|mimes:jpeg,png,jpg,gif,svg|max:2048']);
                $imageName = time().'.'.request()->image->getClientOriginalExtension();
                request()->image->move(public_path('images'), $imageName);
        }
        $post             =  post::find($id);
        $post->type       = $request->get('type');
        $post->slug       = str_slug($request->get('title'));
        $post->title      = $request->get('title');
        $post->body       = $request->get('body');
        $post->excerpt    = $request->get('excerpt');
        $post->tag        = $request->get('tag');
        $post->image      = $imageName;
        $post->metas       = $request->get('metas');
        $post->ispublished = $request->get('ispublished');
        $post->published_at = $request->get('published_at');
        $post->save();

        return redirect()->route('post.index')->with('success','Post updated successfully');

это ошибка, если я не выбираю изображение Обновите, не выбирая изображение, получите ошибку (Laravel)

как я могу делать обновления, не выбирая изображение?

Стоит ли изучать 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-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
0
138
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Он перенаправляется с ошибкой, потому что не может найти переменную $imageName, когда пользователь не выбирает изображение. Вы можете назначить переменную, даже если пользователь не выбирает изображение.

    if ($request->hasFile('image')) 
            {
                    request()->validate(['image' => 'file|image|mimes:jpeg,png,jpg,gif,svg|max:2048']);
                    $imageName = time().'.'.request()->image->getClientOriginalExtension();
                    request()->image->move(public_path('images'), $imageName);
            }else
   {
    $imageName = null;
    }

если я добавлю условие else, изображение не будет найдено при отображении

Dava Eranda 21.06.2019 09:37

Вы должны объявить $imageName перед условием if. Например:

$imageName = ""; 

вы можете использовать if, чтобы проверить, существует ли файл или нет, а затем обновить, если файл существует.

$post             =  post::find($id);
    $post->type       = $request->get('type');
    $post->slug       = str_slug($request->get('title'));
    $post->title      = $request->get('title');
    $post->body       = $request->get('body');
    $post->excerpt    = $request->get('excerpt');
    $post->tag        = $request->get('tag');
    if ($request->hasFile('image')) 
    {
        $post->image = $imageName;
    }
    $post->metas       = $request->get('metas');
    $post->ispublished = $request->get('ispublished');
    $post->published_at = $request->get('published_at');
    $post->save();

да, но если вы пропустили это, то ur $imageName пуст. поэтому это пропустит сохранение изображения, если файл отсутствует.

MekjkrhG 21.06.2019 09:44

Заменить только:

if (isset($imageName) && $imageName !== "") {
    $post->image      = $imageName;
}
Ответ принят как подходящий

Было бы лучше обновить столбец «Изображение» после того, как обновления были выполнены, это также будет работать для создания нового ресурса в модели. Попробуй это.

     $post =  post::find($id);
        $post->type       = $request->get('type');
        $post->slug       = str_slug($request->get('title'));
        $post->title      = $request->get('title');
        $post->body       = $request->get('body');
        $post->excerpt    = $request->get('excerpt');
        $post->tag        = $request->get('tag');
        $post->metas       = $request->get('metas');
        $post->ispublished = $request->get('ispublished');
        $post->published_at = $request->get('published_at');
        $post->save();

 if ($request->hasFile('image')) 
{
 request()->validate(['image' => 'file|image|mimes:jpeg,png,jpg,gif,svg|max:2048']);
        $imageName = time().'.'.request()->image->getClientOriginalExtension();
        request()->image->move(public_path('images'), $imageName);
        $update = Post::where('id', $id)->update([
                 'image' => $imageName
             ]);
        }

оно работает! Спасибо. но это оптимизированный способ или есть другой способ достичь моей цели?

Dava Eranda 21.06.2019 09:49

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

Aditya Thakur 21.06.2019 09:53

Anser от @Aditya Thakur выглядит хорошо, но

если пользователь обновляет изображение

запрос на обновление будет выполняться два раза, это не обязательно

Так что попробуйте код ниже

        $post =  post::find($id);
        $imageName =  $post->image;

        if ($request->hasFile('image')) 
        {
            request()->validate(['image' => 'file|image|mimes:jpeg,png,jpg,gif,svg|max:2048']);
            $uplodedObject = $request->file('image');
            $imageName = md5(time()).'.' .$uplodedObject->getClientOriginalExtension();
            $uplodedObject->move(public_path('images'), $imageName);
        }

        $post->type       = $request->get('type');
        $post->slug       = str_slug($request->get('title'));
        $post->title      = $request->get('title');
        $post->body       = $request->get('body');
        $post->excerpt    = $request->get('excerpt');
        $post->tag        = $request->get('tag');
        $post->image        = $imageName;
        $post->metas       = $request->get('metas');
        $post->ispublished = $request->get('ispublished');
        $post->published_at = $request->get('published_at');
        $post->save();

Вам нужно объявить переменную $imageName.

$imageName = "";

if ($request->hasFile('image')) 
    {
            request()->validate(['image' => 'file|image|mimes:jpeg,png,jpg,gif,svg|max:2048']);
            $imageName = time().'.'.request()->image->getClientOriginalExtension();
            request()->image->move(public_path('images'), $imageName);
    }

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