Как отобразить данные из 2 таблиц в Laravel?

#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>