# 1
Вы не можете загружать отношения условно, основываясь на элементах результата, потому что активная загрузка происходит до того, как вы получите записи, поэтому это не сработает:
# FantasyPlayer.php
public function scopeFantasyGame($query)
{
if($this->position == "DEF") // <--- Laravel doens't retrieve the records yet,
{ // so this won't work
//
}
else
{
//
}
}
# 2
Области локального запроса используются для ограничения запросов, в вашем случае вы хотите загрузить отношения с этой областью, а не с ее общим назначением, но уверены, что можете это сделать:
# FantasyPlayer.php
public function scopeFantasyGame($query)
{
return $query->with(['PlayerGame', 'TeamGame']);
}
Тогда используйте это так:
# YourController.php
public function myFunction($query)
{
$fantasyPlayers = FantasyPlayer::fantasyGame()->get();
}
# 3
Но тогда, если вы хотите всегда загружать отношения, зачем использовать область запроса, а не просто указывать laravel, чтобы загрузить нужные отношения по умолчанию? Вы можете указать это в своей модели (отметьте Eager Загрузка по умолчанию из этого раздела документов):
# FantasyPlayer.php
protected $with = ['PlayerGame', 'TeamGame'];
Обновление
Если вы хотите получить элементы, которые всегда имеют заданные отношения, у вас есть два пути. Для первого вы можете использовать область запроса только для загрузки этих элементов:
# FantasyPlayer.php
public function scopeHasFantasyGame($query)
{
return $query
->has('PlayerGame')
->has('TeamGame');
}
Тогда:
# YourController.php
public function myFunction($query)
{
$fantasyPlayers = FantasyPlayer::hasFantasyGame()->get();
}
Второй вариант - получить элементы, а затем отфильтровать коллекцию на основе существования взаимосвязи (используя функцию Map () ):
# YourController.php
public function myFunction($query)
{
$fantasyPlayers = FantasyPlayer::all()
->map(function ($fantasyPlayer) {
return $fantasyPlayer->PlayerGame()->exists()
&& $fantasyPlayer->TeamGame()->exists();
});
}