当我像这样使用where()
$user = $user->where('age', 21);
它搜索数据库列。我需要能够使用类似于where
的东西,但是要使用自定义属性。我知道这实际上是行不通的,我只是在寻找替代解决方案/建议。
我知道我可以使用自定义sql查询创建数据,因此它确实以列的形式存在,并且仅使用where即可,但是我正在创建一个大型过滤系统,因此SQL查询将过于复杂。 / p>
是否有与where()
类似但具有自定义属性的解决方案?
例如,在完美的世界中,此代码将有效
模型
public function getFooAttribute(){
if($this->age >= 21){
return 'young-adult';
}
}
控制器
$user = $user->where('foo','young-adult')->get();
我所看到的问题都在2015年之前,所以我只想知道今天的laravel版本是否有解决方案?
打开任何建议。
答案 0 :(得分:2)
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');
但是您只需要修改静态数组即可更改组名或年龄段。