在本地范围内使用 whereHasMorph 来建立 MophByMany 关系

Jef*_*son 10 laravel

我需要找出给定球队的当前球员。我为此创建了一个范围。要求是它检查数据透视表以查看 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"`

KUL*_*ING 5

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)