我正在开发Fantasy体育应用。我正在使用的模型是FantasyPlayer,PlayerGame,TeamGame
FantasyPlayer可以有很多PlayerGame和很多TeamGame
public function PlayerGame()
{
return $this->hasMany('App\Models\PlayerGame','player_id','player_id');
}
public function TeamGame()
{
return $this->hasMany('App\Models\FantasyData\TeamGame','team','fantasy_player_key');
}
当我加载数据时,我现在急切地使用:
FantasyPlayer::with(['PlayerGame', 'TeamGame'])->take(1)->get();
加载两个关系然后再加载它们变得很乏味。理想情况下,我希望模型处理此逻辑。这样我就可以执行以下操作:
FantasyPlayer::with(['FantasyGame'])->take(1)->get();
然后,我的FantasyGame范围将包含基于该位置的FantasyPlayer值所需的PlayerGame或TeamGame记录。我想要的是这样的东西……但它对我不起作用:
public function scopeFantasyGame($query)
{
if($this->position == "DEF"){
return $this->TeamGame();
}
else{
return $this->PlayerGame();
}
}
有人知道我可以使用紧急加载并让FantasyGame根据FantasyPlayer位置属性返回正确的关系吗?
FantasyPlayer::with(['FantasyGame'])->take(1)->get();
答案 0 :(得分:1)
您不能根据结果元素有条件地渴望加载关系,这是因为渴望加载是在检索记录之前发生的,因此这是行不通的:
# FantasyPlayer.php
public function scopeFantasyGame($query)
{
if($this->position == "DEF") // <--- Laravel doens't retrieve the records yet,
{ // so this won't work
//
}
else
{
//
}
}
Local Query scopes用于约束查询,在这种情况下,您想加载与此作用域之间的关系,而不是其一般用途,但请确保可以做到这一点:
# FantasyPlayer.php
public function scopeFantasyGame($query)
{
return $query->with(['PlayerGame', 'TeamGame']);
}
然后像这样使用它:
# YourController.php
public function myFunction($query)
{
$fantasyPlayers = FantasyPlayer::fantasyGame()->get();
}
但是,如果您想始终渴望加载关系,为什么要使用查询范围而不是仅告诉laravel默认加载所需的关系?您可以在模型中指定它(检查文档this section的默认默认加载)
# 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();
});
}