За последние 24 часа нас посетил 22791 программист и 1264 робота. Сейчас ищет 761 программист ...

Странное поведение IF в selectRaw (Laravel 5.5)

Тема в разделе "Laravel", создана пользователем ADSoft, 13 дек 2018.

  1. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    736
    Адрес:
    Татарстан
    Доброго времени суток всем....
    Ломаю голову над простой вроде-бы задачей:

    PHP:
    1. dd(DB::table('t')->selectRaw(" IF(1=?,1,'2') AS S",[1])->first());
    Вроде все просто, и в ответе должен получить что? правильно - 1 как число, а получаю "1" как строку
    Причем, если второе значение '2' делаю числом - результат тот - что хотел....

    Получается, что идет какая то оптимизация, и если внутри IF один из вариантов строка, второй так же приводится к этому типу (((

    В чистых запросах SQL такой ерунды нет ....
    Как быть?
    (попытки приводить принудительно внутри IF к нужному типу - а-ля
    Код (Text):
    1. CAST(1 AS UNSIGNED)
    , или использовать
    Код (Text):
    1. select(DB::raw(...))
    не прокатывает
     
  2. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    736
    Адрес:
    Татарстан
    ну и какой вывод там можно сделать? - когда 1 - то число, '1' - строка? Это ежу понятно и к описанной мной проблеме отношения не имеет...
    если в чистом SQL сделать запрос
    Код (Text):
    1. SELECT IF(1=1,1,'2') AS bug
    то получаем верный результат - 1 как число
    В том то и загвоздка, что фасад Ларавела DB почему-то решает преобразовать это значение к строке
     
  3. Sail

    Sail Старожил

    С нами с:
    1 ноя 2016
    Сообщения:
    1.591
    Симпатии:
    360
    @ADSoft, я потому и удалил сообщение, что вчитался во фразу про то, что: "В чистых запросах..." :)
     
  4. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    736
    Адрес:
    Татарстан
    а я успел ответить ))))
     
  5. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    @ADSoft хм... самого запроса?
    PHP:
    1. DB::enableQueryLog();
    2. DB::table('t')->selectRaw(" IF(1=?,1,'2') AS S",[1])->first();
    3. dd(DB::getQueryLog());
     
  6. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    736
    Адрес:
    Татарстан
    не поверите - все как и предполагается
    Код (Text):
    1. 0 => array:3 [
    2.     "query" => "SELECT IF(1=?,1,'2') AS S"
    3.     "bindings" => array:1 [
    4.       0 => 1
    5.     ]
    и так пробовал
    Код (Text):
    1. DB::select("SELECT IF(1=?,1,'2') AS S",[1]);
    и так
    Код (Text):
    1. DB::select("SELECT IF(1=1,1,'2') AS S");
    отписал на гитхабе про баг .. посмотрим че скажут
     
  7. nospiou

    nospiou Старожил

    С нами с:
    4 фев 2018
    Сообщения:
    3.400
    Симпатии:
    510
    Кстати можно и так если по быстрому
    PHP:
    1. dd(DB::table('t')->selectRaw(" IF(1=?,1,'2') AS S",[1])->first()->toSql());
    А что мешает перевести перевести строку в число? В php это не особо важно для json есть JSON_NUMERIC_CHECK
     
  8. ADSoft

    ADSoft Старожил

    С нами с:
    12 мар 2007
    Сообщения:
    3.824
    Симпатии:
    736
    Адрес:
    Татарстан
    да ниче не мешает, но имхо это костыли ... не должно так работать
    пример - только для понимания, там не одна запись а куча, и в json то не отдаю - вот проблема, и использую то не в php далее
    вот такие пироги, я конечно временный хак сделал - мапнул в коллекции данные значения .... но это как то все не по феншую