Laravel - получить 5 лучших из нескольких отношений - PullRequest
1 голос
/ 30 апреля 2020

У меня есть пользователь, галерея и журнал. отношения выглядят так:

У пользователя много галерей. У галерей много журналов.

Мне нужно получить 5 самых последних журналов из любой галереи, принадлежащей этому пользователю. Что меня смущает, так это то, как я могу объединить все галереи и взять 5 лучших из них вместе?

1 Ответ

2 голосов
/ 30 апреля 2020

При условии, что ваши отношения следующие:

users
    id - integer
    name - string

galleries
    id - integer
    user_id- integer
    name - string

logs
    id - integer
    gallery_id - integer
    title - string

Вы можете использовать hasManyThrough Relationship (https://laravel.com/docs/7.x/eloquent-relationships#has -many-through )

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class User extends Model
{
    /**
     * Get all of the logs for the user.
     */
    public function logs()
    {
        return $this->hasManyThrough('App\Log', 'App\Gallery');
    }
}

Вы можете затем получить последние журналы, используя:

    $logs = User::whereHas('logs', function($query){
        $query->orderBy('created_at', 'desc');
    })->get();

РЕДАКТИРОВАТЬ

Вы не можете ограничить количество журналов, взятых в отношении. Обходной путь - загрузить запрошенные ограниченные отношения отдельно, как описано здесь: https://github.com/laravel/framework/issues/18014

Вы можете обновить свою модель пользователя:

/**
 * Limit the relationship to only include 5 results
 */
public function onlyFiveLogs()
{
    return $this->logs()->take(5);
}

И затем для каждого $ Пользователь, вы можете загрузить отношения вручную:

$users->each(function($user) {
    $user->load('onlyFiveLogs');
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...