#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
таблице должно быть значение, ссылающееся на файл, просто используйте его по мере необходимости.