Как отобразить последнюю запись из отношения manyToMany в Laravel 5.6

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

uploads table
id          fileName        vehicle_id
1            1.jpg               1
2            2.jpg               1
3            3.jpg               1
4            4.jpg               1
5            28.png              2
6            28.png              2
7            29.png              2
8            30.png              3
9            31.png              3
10           56.png              3

Таблица транспортных средств имеет отношения "многие ко многим" с таблицей изображений и графиком данных с использованием нетерпеливого загрузчика в VehicleController,

$vehicles = Vehicle::with('uploads')->get();
        return view('vechicles.index')->withVehicles($vehicles);

Теперь эти изображения отображаются в файле cars / index.blade.php.

 @foreach($vehicle->uploads as $upload)

         <tr>
                        <td><a href="{{route('vechicles.show',$vehicle->id)}}"><img src="/images/{{ $upload->resized_name }}"></a></td>

                    </tr>

        @endforeach

Моя проблема возникла сейчас, поэтому я могу показать все изображения в таблице, связанные с правильным vehicle_id, но мне нужно показать только одно изображение (для соответствия vehicle_id) как эскиз к строке выше. Тогда как я могу это настроить? на самом деле мне нужно только одно изображение для печати в index.blade.php, связанное с каждым vehicle_id, в качестве примера вот 4 изображения, связанные с vehicle_id 1. но мне нужно только распечатать по убыванию или одно изображение для печати и то же самое для vehicle_id 2 и и т.д .... как это сделать?

Обновленная модель пользователя

class Upload extends Model
{
    public function vehicle()
    {
        return $this->belongsTo(Vehicle::class);
    }
}

обновленная модель автомобиля

 class Vehicle {
    public function thumbnail() {
        return $this->hasOne(Upload::class)->orderByDesc('id');
    }
}

$vehicles = Vehicle::with('thumbnail')->get();

текущий файл Blade

 @if($vehicles)
@foreach($vehicles as $vehicle)
{{$vehicle->district}}
{{$vehicle->town}}
{{$vehicle->brand}}
{{$vehicle->model}}

<hr>

 <tr>
  @foreach($vehicle->thumbnail as $aaa)
                    <img src="/images/{{ $aaa->resized_name }}">
                    @endforeach

                </tr>


@endforeach
@endif

person banda    schedule 13.07.2018    source источник
comment
Пожалуйста, опубликуйте uploads отношения.   -  person Jonas Staudenmeir    schedule 13.07.2018
comment
См. "Моя обновленная модель пользователя"   -  person banda    schedule 13.07.2018


Ответы (2)


Решение @Jonas Staudenmeier - самое чистое. Однако, если по какой-либо причине вы не можете обновить модель, вы можете использовать это в любом шаблоне лезвия.

app / Http / Controllers / VehiculeController.php

<?php
    namespace App\Http\Controllers;

    use Illuminate\Http\Request;
    use App\Vehicule;

    class VehiculeController extends Controller {
        public function index() {
            $vehicules = Vehicule::with('uploads')->get();

            return view('vehicule.index')->withVehicules($vehicules);
        }
    }
?>

ресурсы / представления / автомобиль / index.blade.php

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <table>
        <tbody>
            @forelse( $vehicules as $vehicule )
                <td>
                    @if( $vehicule->uploads->count() > 0 )
                        <a href="{{ route('vehicules.show', $vehicule->id) }}">
                            @php
                                $upload = $vehicule->uploads->sortByDesc('id')->first();
                            @endphp
                            <img src="{{ $upload->resized_name }}" alt="{{ $upload->fileName }}" />
                        </a>    
                    @else
                        This vehicule does not have any images attached.
                    @endif
                </td>
            @empty
                <td>No vehicules to display.</td>
            @endforelse
        </tbody>
    </table>
</body>
</html>

Здесь мы используем метод Laravel Collection ->first() для получения первого метода, но не забывайте (это сделано в примере) проверять, есть ли какие-либо загрузки (или какие-либо отношения в целом), когда вы получаете первый элемент.

Когда вы получаете отношения модели, все методы коллекции Laravel доступны до тех пор, пока вы используйте финишер (first, all, ...).

person Anwar    schedule 13.07.2018
comment
произошла эта ошибка Попытка получить свойство не-объекта (View: C: \ Users \ Banda \ Desktop \ acxian \ resources \ views \ vechicles \ index.blade.php) - person banda; 13.07.2018
comment
Проверьте, совпадает ли ваше поле в таблице загрузок со свойством, которое я написал в этом примере: fileName, resized_name. - person Anwar; 13.07.2018

Попробуйте последний метод, чтобы получить самую последнюю модель.

class Vehicle {
    public function thumbnail() {
        return $this->hasOne(Upload::class)->latest();
    }
}
person Mahbub    schedule 13.07.2018
comment
в вашей миниатюре общедоступной функции () что означает миниатюра, это модель? - person banda; 13.07.2018
comment
Пожалуйста, проверьте, что вы загрузили - person Mahbub; 13.07.2018
comment
согласно моим знаниям, это должна быть модель? - person banda; 13.07.2018
comment
thumbnail метод вернет последнюю вставленную Upload модель - person Mahbub; 13.07.2018