我需要找出给定球队的当前球员。我为此创建了一个范围。要求是它检查数据透视表以查看 left_at 字段是否为空。如果为 Null,则表示他们仍在团队中(当前玩家)。该关系是多态的多对多关系。之所以多态,是因为一支球队也可以有球员来来去去,也可以有球队的教练。
团队.php
/**
* Scope a query to only include current players.
*
* @param \Illuminate\Database\Eloquent\Builder $query
*/
public function scopeCurrentPlayers($query)
{
return $query->whereHasMorph('players', Player::class, function ($query) {
$query->whereNull('left_at');
});
}
**
* Get all players that have been members of the stable.
*
* @return \Illuminate\Database\Eloquent\Relations\MorphByMany
*/
public function players()
{
return $this->morphedByMany(Player::class, 'member')->using(Member::class)->withPivot(['joined_at', 'left_at']);
}
Run Code Online (Sandbox Code Playgroud)
控制器
$currentTeamPlayers = $team->currentPlayers()->get()->pluck('id');
Run Code Online (Sandbox Code Playgroud)
我希望获得团队中现有球员的集合,但是我收到以下错误。
+exception: Symfony\Component\Debug\Exception\FatalThrowableError^ {#5387 -originalClassName: "TypeError" #message: "传递给 Illuminate\Database\Eloquent\Builder::getBelongsToRelation() 的参数 1 必须是 Illuminate\Database 的实例\Eloquent\Relations\MorphTo,Illuminate\Database\Eloquent\Relations\MorphToMany 的实例,在 /Users/jeffreydavidson/Projects/Ringside/vendor/laravel/framework/src/Illuminate/Database/Eloquent/Concerns/QueriesRelationships.php 中调用在线 215"`
whereHasMorph
函数仅适用于morphTo
关联。参考:https://laravel.com/docs/8.x/eloquent-relationships#querying-morph-to-relationships
对于morphMany
关联,您可以简单地使用whereHas
. 参考: https: //laravel.com/docs/8.x/eloquent-relationships#querying-relationship-existence
所以就你而言,
public function scopeCurrentPlayers($query)
{
return $query->whereHas('players', Player::class, function ($query) {
$query->whereNull('left_at');
});
}
Run Code Online (Sandbox Code Playgroud)