Как отобразить изображение по умолчанию, если в базе данных Laravel нет имени файла - PullRequest
0 голосов
/ 19 марта 2020

Я хочу отобразить изображение для каждой записи в списке сообщений. Наименования изображений являются уникальными именами файлов. Все они сохраняются в таблице базы данных (MySQL). Для каждого поста имеется более одного изображения. Код работает правильно. За исключением случаев, когда есть сообщение без имени файла изображения. Это возможный сценарий, но я не могу заставить код работать. В случае, если для сообщения нет существующего имени файла, я хочу отобразить имя файла по умолчанию. Вот мой код:

Картинки logi c:

   /**
     * Get a vehicle's top or main image data from the image table
     */
     public function topImage($id)
    {
        $image = Vehiclefulldataimage::where('vehiclefulldatas_id', $id)
              ->orderBy('id', 'ASC')->first();

        return $image;
    }

Вот вид лезвия, Сообщения:

    @if (count($posts) > 0)
        @foreach($posts as $post)
            <?php $imageFilename = (new \App\Models\Logic\Images)->topImage($post->id); ?>
            <!--Item-->
            <li>
                <div class="preview">
                    @if ($imageFilename = 0)
                    <img src="{{ asset('images') . '/' . 'defaultImage.jpg' }}" alt="No photo">
                    @else
                    <img src="{{ asset('images') . '/' . $imageFilename->disk_image_filename }}" alt="{{ ucfirst($imageFilename->caption) . ' | ' . $post->title }}">
                    @endif
                </div>
                <div class="desc">
                    <h3>{{ str_limit($post->title, 100, '...') }}</h3>
                </div>       
            </li>
            <!--/Item-->
        @endforeach
    @endif

Это сообщение об ошибке, которое я получаю: " Попытка получить свойство Non Object "

Ответы [ 4 ]

0 голосов
/ 25 марта 2020

Спасибо всем. Посмотрев на все ответы, я сделал простое изменение своего кода. Я изменил: @if ($imageFilename = 0)

на: @if ($imageFilename == null)

Таким образом, мой код теперь выглядит так:

@if (count($posts) > 0)
        @foreach($posts as $post)
            <?php $imageFilename = (new \App\Models\Logic\Images)->topImage($post->id); ?>
            <!--Item-->
            <li>
                <div class="preview">
                    @if ($imageFilename == null)
                    <img src="{{ asset('images') . '/' . 'defaultImage.jpg' }}" alt="No photo">
                    @else
                    <img src="{{ asset('images') . '/' . $imageFilename->disk_image_filename }}" alt="{{ ucfirst($imageFilename->caption) . ' | ' . $post->title }}">
                    @endif
                </div>
                <div class="desc">
                    <h3>{{ str_limit($post->title, 100, '...') }}</h3>
                </div>       
            </li>
            <!--/Item-->
        @endforeach
    @endif
0 голосов
/ 20 марта 2020

Попробуйте следующий код: вместо оператора сравнения вы используете оператор присваивания

    //@if (count($posts) > 0)
@if (!$posts->isEmpty())
        @foreach($posts as $post)
            <?php $imageFilename = (new \App\Models\Logic\Images)->topImage($post->id); ?>
            <!--Item-->
            <li>
                <div class="preview">
                //@if ($imageFilename = 0) this is an assignment operator not comparison operator
                    @if ($imageFilename->isEmpty())
                    <img src="{{ asset('images') . '/' . 'defaultImage.jpg' }}" alt="No photo">
                    @else
                    <img src="{{ asset('images') . '/' . $imageFilename->disk_image_filename }}" alt="{{ ucfirst($imageFilename->caption) . ' | ' . $post->title }}">
                    @endif
                </div>
                <div class="desc">
                    <h3>{{ str_limit($post->title, 100, '...') }}</h3>
                </div>       
            </li>
            <!--/Item-->
        @endforeach
    @endif
0 голосов
/ 20 марта 2020

Все ответы выше решают вашу проблему. Тем не менее, я рекомендую вам решить эту проблему с помощью функций Laravel, Мутаторы.

https://laravel.com/docs/5.8/eloquent-mutators

Laravel мутаторы позволяют форматировать или изменять атрибут модели.

Просто в вашей модели Vehiclefulldataimage напишите код ниже :

public function getImageAttribute($value) 
{
     //can write more logic here.
     return $value ?: 'path/to/your/default/image';
}

Тогда вам все равно, будет ли шаблон условия блейда. Если ваше изображение пусто, мутатор возвращает изображение по умолчанию. Таким образом, везде, когда вы получаете экземпляр Vehiclefulldataimage, мутатор работает правильно

0 голосов
/ 20 марта 2020

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

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