等效于自定义属性的'where()'



我知道雄辩,当使用像这样的where()

$user = $user->where('age', 21);

它搜索数据库列。我需要能够使用类似于where的东西,但在自定义属性上。我知道这实际上不可行,我只是在寻找替代解决方案/建议。

我知道我可以使用自定义 sql 查询创建数据,因此它确实作为列存在并只使用 where 来,但我正在创建一个大型过滤系统,因此 SQL 查询太复杂了。

是否有任何解决方案与where()相似并且可以实现与相同但具有自定义属性的解决方案?

例如,在理想世界中,此代码将起作用

public function getFooAttribute(){
if($this->age >= 21){
return 'young-adult';
}
}

控制器

$user = $user->where('foo','young-adult')->get();

我看到的问题都是在2015年之前,所以我只想知道今天版本的laravel是否有任何解决方案?

欢迎任何建议。

where操作通过查询对数据库执行,但自定义属性仅存在于模型上,该属性在查询数据库后填充。使用示波器可能会有更好的运气

,例如:
function scopeAgeGroup($query, $ageGroup) {
switch ($ageGroup) {
case 'young-adult':
$query->where('age', >, 21); 
break;
// More cases if needed
}
}

然后你可以做:

$user->ageGroup('young-adult');

但是,这意味着您需要以某种方式手动保持访问器和作用域的一致性。为了帮助保持一致,您可以执行以下操作:

class User {
private static $ageBreakdowns = [
'young-adult' => [ 21, 35 ],
'less-young-adult' => [ 36, 50 ],
'less-less-young-adult' => [ 51, 100 ]
];

public function getFooAttribute(){
foreach (self::$ageBreakdowns as $groupName => $ageGroup) {
if ($this->age > $ageGroup[0] && $this->age <= $ageGroup[1]) {
return $groupName;
}
}
return 'really-young';
}
function scopeAgeGroup($query, $ageGroup) {
if (array_key_exists($ageGroup, self::$ageBreakdowns) {
$query->whereBetween('age', self::$ageBreakdowns[$ageGroup]); 
}                
}
}

然后你也可以做:

$user->ageGroup('young-adult');

但是您只需要修改静态数组即可更改组名称或年龄范围。

最新更新