Кастинг атрибутов Laravel - PullRequest
       5

Кастинг атрибутов Laravel

0 голосов
/ 16 сентября 2018

Здесь все значения 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 голосов
/ 16 сентября 2018

Использовать встроенный тип приведения

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

Он автоматически преобразует их в целые числа.Подробнее здесь

Вы также можете использовать красноречивые мутаторы и методы доступа для преобразования их в int следующим образом:

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

}
0 голосов
/ 16 сентября 2018

Используйте фасад 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);
0 голосов
/ 16 сентября 2018

Попробуйте этот метод, иначе вам нужно привести атрибуты в Eloquent, добавив в вашу модель защищенный массив $ casts.

return User::whereHas('UserMeta', function ($query) use ($value) {
$query->where('meta_key', 'price')
      ->where('meta_value','< =', (int)$value);
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...