Laravel 雄辩的范围总是返回一个集合

Posted

技术标签:

【中文标题】Laravel 雄辩的范围总是返回一个集合【英文标题】:Laravel eloquent scope always returns a collection 【发布时间】: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 语句添加到约束中,并且似乎注意保留行为。 【参考方案1】:

也许你可以使用hasOne of many relationship:

class User extends Model

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

【讨论】:

以上是关于Laravel 雄辩的范围总是返回一个集合的主要内容,如果未能解决你的问题,请参考以下文章

Laravel:创造雄辩的范围

Laravel - 将数组转换为雄辩的集合

Laravel 雄辩与查询构建器的优缺点

带有“LIKE”语句的雄辩查询在 Laravel 6 中不起作用

遍历数组集合并返回命名键值对(Laravel/Eloquent)

如何检查 Laravel 集合是不是为空?