Отображение изображения по умолчанию в таблице отношений

#php #laravel #laravel-5 #eloquent

#php #laravel #laravel-5 #красноречивый

Вопрос:

Ребята, у меня есть таблица products и products_images.

В моей модели продукта у меня есть метод, который получает изображение, связанное с продуктом, а в модели product_images у меня есть другой метод (mutator), который проверяет, существуют ли изображения, и в случае, если они существуют, показывает изображение, если не показывает изображение по умолчанию.

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

Вот как я сделал:

Модель продукта:

  public function image()
    {
      return $this->hasOne(ProductImage::class);          
    }
  

Модель ProductImage:

 protected $fillable = [
        'product_id', 'path', 'is_main_image'
    ];
    public function getPathAttribute($value)
    {

        if($value){

            $image = url('storage/media/products/thumbs/'.$value);
        }else{
            $image = 'https://via.placeholder.com/206';
        }
        return $image;
    }
  

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

Ответ №1:

Вы можете проверить существование image связи в Product модели, что-то вроде:

Product.php:

 public function image(){
  return $this->hasOne(Image::class);
}

public function getImageSrcAttribute(){
  if($this->image){
    return url("storage/media/products/thumbs/".$this->image->path);
  }
  return "https://via.placeholder.com/206";
}
  

И, просто в вашем блейде, вызовите

 <img src='{{ $product->image_src }}'/>
  

Обратите внимание, $this->image->path это просто заполнитель; в вашей images таблице должно быть значение, ссылающееся на файл, просто используйте его по мере необходимости.