Laravel Eloquent - объединение запросов в один с использованием отношений - PullRequest
0 голосов
/ 05 февраля 2019

Я работаю над проектом, в котором я использую Laravel Eloquent для извлечения всех моих данных из моей базы данных.

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

Я создал отношение в модели Club:

public function basketballPlayers()
    {
        return $this->hasManyThrough('App\Models\Basketball\BasketballPlayer','App\Models\Basketball\BasketballTeam','id','team_id');
    }

И userотношение в модели BasketballPlayer:

public function user()
    {
        return $this->hasOne('App\User','id','user_id');
    }

Теперь, когда я выполняю следующую команду, DB::getQueryLog() возвращает 3 запроса.

Club::findOrFail($club_id)->basketballPlayers()->with('user')->get();

Но когда я выполняю следующую команду без использованияRelations, DB::getQueryLog() возвращает только 1 запрос.

$players = BasketballPlayer::Join('basketball_teams','basketball_teams.id','=','basketball_players.team_id')
            ->join('users','users.id','=','basketball_players.user_id')
            ->where('basketball_teams.club_id','=',$authUser->club_id)
            ->get(['basketball_players.*','users.firstname','users.lastname','basketball_teams.name']);

Мне не нужны все данные от клуба и пользователя (см. ->get(...) в запросе на присоединение).

Можно ли достичь того же результата, что и в «длинном» ручном соединительном запросе, используя гораздо более понятный и простой подход Eloquent для отношений?

Спасибо за вашу помощь!

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете читать меньше данных, используя with (не все пользовательские столбцы в качестве примера) с помощью этого

Club::findOrFail($club_id)
    ->basketballPlayers()
    ->with('user:id,firstname,lastname')   // <- here is change
    ->get();

Важным является столбец id (и внешние ключи).Вы также должны иметь возможность сделать вложенный with следующим образом (я пишу код из головы - пожалуйста, проверьте его):

Club::findOrFail($club_id)
    ->with('BasketballPlayer:id,user_id')
    ->with('BasketballPlayer.user:id,firstname,lastname')   
    ->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...