Laravel, Получить строку с самым высоким столбцом версии из базы данных - PullRequest
0 голосов
/ 15 января 2020

На данный момент у меня есть отношения 1 ко многим между двумя моделями. Модель машины и модель документа. Документ может иметь несколько версий, и я всегда связан с моей машиной. Теперь я хочу показать только документы с последней или самой высокой версией.

Я попытался получить версию из документа, но затем я могу вернуть только 1 документ в мое представление вместо того, чтобы возвращать несколько документов. Я также пытался получить документы следующим образом, но я застрял с шагами, которые мне нужно предпринять после создания l oop:

$machine = Machine::find($id);
    $documents = $machine->documents;

    foreach($documents as $document)
    {

    }



    dd($documents);

    return view('machine.detail', compact('machine'));

Итак, чтобы задать свой вопрос: Как я могу вернуться только уникальные документы с последней версией на мой взгляд. Поэтому, если файл 1 имеет версии 1,2,3,10, а файл 2 имеет версии 1,2,3, я хочу вернуть версию 10 файла 1 и версию 3 файла 2.

Ответы [ 2 ]

4 голосов
/ 15 января 2020

Если я правильно понимаю ваш вопрос, вы можете сделать следующее.

// Add this relation also on your model where your hasMany is on properly Machine.php
public function latestDocument()
{
    return $this->hasOne(Document::class)
        ->latest('version_column');
}
// Controller
$machine = Machine::with(['latestDocument'])->findOrFail($id);

$document = $machine->latestDocument;

return view('machine.detail', compact('machine'));
1 голос
/ 15 января 2020

Если у вас есть уникальный ключ для каждого документа, который является общим для всех версий, что-то вроде этого должно работать.

$documents = $machine->documents->groupBy('name of your unique key')->map(function($documents) {
    $latestVersion = $documents->max('version');
    return $documents->firstWhere('version', $latestVersion);
});

Объяснение: Получить последнюю версию из каждого документа, нам сначала нужно сгруппировать все документы по ключу, чтобы разделить все ненужные документы на несколько коллекций, которые содержат версии.

Затем нам нужно отобразить их в новую коллекцию, где мы получим документ только с последней версией.

Примечание: не забудьте изменить $machine = Machine::find($id); на $machine = Machine::with('documents')->find($id);, чтобы загружать документы заранее. Это предотвратит проблему запроса n + 1

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...