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 雄辩的范围总是返回一个集合的主要内容,如果未能解决你的问题,请参考以下文章
带有“LIKE”语句的雄辩查询在 Laravel 6 中不起作用