等同于自定义属性上的“ where()”

时间:2018-08-15 13:48:14

标签: php laravel laravel-5

当我像这样使用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版本是否有解决方案?

打开任何建议。

1 个答案:

答案 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');

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