【问题标题】:Laravel eloquent scope always returns a collectionLaravel 雄辩的范围总是返回一个集合
【发布时间】:2021-06-23 05:54:51
【问题描述】:

我有以下型号:

class EmailAddress extends Model
{
    public function scopePrimary($query)
    {
        return $query->firstWhere('is_primary', true);
    }
}

class User extends Model
{
    public function emailAddresses()
    {
        return $this->hasMany(EmailAddress::class);
    }
}

echo $user->emailAddresses()->primary()->get();

我希望 Laravel 会返回一个模型,因为 firstWhere() 本质上是在查询中执行 LIMIT 1 ,但我总是得到一个包含一个模型的集合。难道我做错了什么?如何解决?

提前致谢!

【问题讨论】:

  • 您可能遇到了错误。在vendor/laravel/framework/src/Illuminate/Database/Eloquent/Builder.php 中,我们在第 278 行读取函数 firstWhere()return $this->where($column, $operator, $value, $boolean)->first();。正如您正确指出的那样,您不应该收藏。也许现在把它分开,把捷径放在一边。 return $query->where('is_primary', true)->first();
  • 另一方面,它是一个作用域。如何在控制器中实现作用域?
  • 我猜,问题有点不同。我刚刚检查了我提供的 sn-p,它实际上并没有显示所有相关代码(对此感到抱歉)。我在HasMany 关系上使用范围。乍一看,如果你在关系之后这样做,它应该起作用,但是传入的查询只是将 where 语句添加到约束中,并且似乎注意保留行为。

标签: php laravel eloquent laravel-8 laravel-query-builder


【解决方案1】:

也许你可以使用hasOne of many relationship

class User extends Model
{
    public function primaryEmailAddress()
    {
        $this->hasOne(EmailAddresses::class)->ofMany([], function ($query) {
            $query->where('is_primary', true);
        });
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-09-08
    • 2014-08-14
    • 1970-01-01
    • 2015-03-04
    • 2020-09-08
    • 2015-08-15
    • 1970-01-01
    • 2014-10-08
    相关资源
    最近更新 更多