Laravel属性转换

时间:2018-09-16 06:28:27

标签: laravel casting eloquent

这里metakey和metavalue的所有值都是字符串类型,因此价格200和100都也是字符串。 我想在最低和最高价格范围内过滤用户。但是我很难做到这一点,因为200和100都是字符串。

UsersTable

id|name

   1|xx

UserMeta表

id | user_id | metaKey | metavalue

  1 | 1        | city     | kolkata

  2 |2         |city      | london

  3 |8         |city      |london

  4 |1         |price     |200

   5|8         |price     |100

我尝试过的方法:

return User::whereHas('UserMeta', function ($query) use ($value) {
    $query->where('meta_key', 'price')
          ->where('meta_value','< =', intval($value));
});

3 个答案:

答案 0 :(得分:4)

否则请尝试此方法,您需要通过在模型中添加受保护的$ casts数组来在Eloquent中强制转换属性。

return User::whereHas('UserMeta', function ($query) use ($value) {
$query->where('meta_key', 'price')
      ->where('meta_value','< =', (int)$value);
});

答案 1 :(得分:1)

使用内置类型转换

class User extends Model
{
   /**
   * The attributes that should be cast to native types.
   *
   * @var array
   */
   protected $casts = [
       'meta_key' => 'int',
       'meta_value' => 'int',
   ];
}

它将自动将它们转换为整数。了解更多here

您还可以使用雄辩的更改器和访问器将它们转换为int,如下所示:

public function setMetaValueAttribute($value)
{
   if($this->attributes['meta_key'] == 'price'){
    $this->attributes['meta_value'] = (int)$value;
   }

}

答案 2 :(得分:0)

使用DB门面。

<?php
$data = DB::table('UserMeta')
            ->select(DB::raw("min(cast(metavalue as unsigned)) as 'min_value',max(cast(metavalue as unsigned)) as 'max_value'"))
            ->where('metaKey','=','price')
            ->get()[0];

$min_value = $data->min_value;
$max_value = $data->max_value;

$user_meta = DB::select("
                   select * 
                   from UserMeta
                   where cast(metavalue as unsigned) >= ". $min_value . " and cast(metavalue as unsigned) <= ". $max_value
                );
echo "<pre>";
var_dump($user_meta);