这里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));
});
答案 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);