【问题标题】:Using whereHasMorph inside a local scope for MophByMany relationships在 MophByMany 关系的本地范围内使用 whereHasMorph
【发布时间】:2019-07-27 15:31:28
【问题描述】:

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

控制器

$currentTeamPlayers = $team->currentPlayers()->get()->pluck('id');

我希望获得团队中当前球员的集合,但我收到以下错误。

+异常:Symfony\Component\Debug\Exception\FatalThrowableError^ {#5387 -originalClassName:“类型错误” #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 行"`

【问题讨论】:

  • 您找到解决方案了吗?我也遇到了这个。
  • 嗨,即使我遇到了同样的问题。你有解决办法吗?
  • 你已经有了变形关系,所以你的范围可能看起来像:public function scopeCurrentPlayers($query) { return $query->whereHas('players', function ($query) { $query->whereNull('left_at'); }); }

标签: laravel


【解决方案1】:

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');
    });
}

【讨论】:

    猜你喜欢
    • 2019-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-21
    • 2021-04-30
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    相关资源
    最近更新 更多