#laravel #fetch
Вопрос:
Ресторанная Модель
class Restaurant extends Model
{
use HasFactory;
public $timestamps = false;
public function menus(){
return $this->hasMany(Menu::class, 'resto_id');
}
public function restoimages(){
return $this->hasOne(RestoImage::class, 'resto_id');
}
}
Модель восстановленного изображения
class RestoImage extends Model
{
use HasFactory;
public $timestamps = false;
protected $fillable = ['image','resto_id'];
public function restaurants(){
return $this->belongsTo(Restaurant::class, 'resto_id');
}
}
Просмотр файла
<div class="card mb-4">
<div class="card-body">
<table id="datatablesSimple">
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Email</th>
<th>Image</th>
<th>Address</th>
<th colspan="2">Operations</th>
</tr>
</thead>
<tbody>
@foreach($data as $item)
<tr>
<td>{{$item->id}}</td>
<td>{{$item->name}}</td>
<td>{{$item->email}}</td>
<td>{{$item->restoimages->image}}</td>
<td>{{$item->address}}</td>
<td><button><a href="{{route('editresto', $item->id)}}">EDIT</a></button></td>
</tr>
@endforeach
</tbody>
</table>
</div>
</div>
Контролер-реставратор
public function list(){
$data = Restaurant::with('restoimages')->get();
$restoimages = RestoImage::all();
return view('list', compact('data', 'restoimages'));
}
У меня есть 2 стола, один-рестораны, а другой-resto_images. Когда администратор вставляет новый ресторан с помощью формы. Запись будет вставлена в таблицу aboce 2. в таблице resto_images есть столбец resto_id, но когда я попытался отобразить изображение из таблицы resto_images, оно выдает ошибку (попытка прочитать свойство «изображение» при нулевом значении). Пожалуйста, поправьте меня, если я ошибаюсь. Заранее спасибо.
Комментарии:
1. Там
return $this->belongsTo(Restaurant::class, 'id');
внешний ключ-это идентификатор, не так ли? И в очереди$item->restoimages->image
, я думаю, вам следует проверить, есть ли восстановленные изображения или нет.2. @FatimaMazhit Да, я пытался таким образом, но это показывает ту же ошибку.
3. У всех ли ваших ресторанов есть изображения ?
4. @Atika Да, в каждом ресторане есть 1 изображение
5. Теперь это решено. Спасибо всем, кто мне помог.
Ответ №1:
по вашему мнению, вы можете использовать дополнительную функцию Laravel или проверить, есть ли реальная ценность в ваших отношениях с, если,
<td>{{ optional($item->restoimages)->image}}</td>
или
<td>{{ $item->restoimages ? $item->restoimages->image : null }}</td>
Не забудьте тег img, если вы хотите показать изображение, и атрибут css для изменения размера изображения.
Комментарии:
1. Я попробовал 2-й способ, как вы упомянули. Но теперь результат такой, как показано ниже. 620.McD.png Мне не нужно это имя. Я хочу, чтобы изображение отображалось
2. Используйте тег img. « <td> @if ($item-<td>>восстановленные изображения) <td>><img src=»{{путь к хранилищу($item->>восстановленные изображения-<img src=»{{путь к хранилищу($item-> > изображение)}}» /<img src=»{{путь к хранилищу($item->>> @endif <img src=»{{путь к хранилищу($item->>></td> « Если вы используете другой путь для хранения изображения в базе данных, вы можете удалить или изменить функцию storage_path с помощью public_path или ничего. Просто
$item->restoimages->image
если это ссылка
Ответ №2:
Если ваши изображения находятся непосредственно в public
папке, то :
<td style="width:150px;height:100px;"> //some style to resize images
@if ($item->restoimages)
<img src="{{ asset($item->restoimages->image) }}" alt="">
@else
<p>no image</p>
@endif
</td>
Но если ваши изображения есть public/folderName
, то :
<td style="width:150px;height:100px;">
@if ($item->restoimages)
<img src="{{ asset('folderName/' . $item->restoimages->image) }}" alt="">
@else
<p>no image</p>
@endif
</td>