Доброго времени суток всем.... Ломаю голову над простой вроде-бы задачей: PHP: dd(DB::table('t')->selectRaw(" IF(1=?,1,'2') AS S",[1])->first()); Вроде все просто, и в ответе должен получить что? правильно - 1 как число, а получаю "1" как строку Причем, если второе значение '2' делаю числом - результат тот - что хотел.... Получается, что идет какая то оптимизация, и если внутри IF один из вариантов строка, второй так же приводится к этому типу ((( В чистых запросах SQL такой ерунды нет .... Как быть? (попытки приводить принудительно внутри IF к нужному типу - а-ля Код (Text): CAST(1 AS UNSIGNED) , или использовать Код (Text): select(DB::raw(...)) не прокатывает
ну и какой вывод там можно сделать? - когда 1 - то число, '1' - строка? Это ежу понятно и к описанной мной проблеме отношения не имеет... если в чистом SQL сделать запрос Код (Text): SELECT IF(1=1,1,'2') AS bug то получаем верный результат - 1 как число В том то и загвоздка, что фасад Ларавела DB почему-то решает преобразовать это значение к строке
@ADSoft хм... самого запроса? PHP: DB::enableQueryLog(); DB::table('t')->selectRaw(" IF(1=?,1,'2') AS S",[1])->first(); dd(DB::getQueryLog());
не поверите - все как и предполагается Код (Text): 0 => array:3 [ "query" => "SELECT IF(1=?,1,'2') AS S" "bindings" => array:1 [ 0 => 1 ] и так пробовал Код (Text): DB::select("SELECT IF(1=?,1,'2') AS S",[1]); и так Код (Text): DB::select("SELECT IF(1=1,1,'2') AS S"); отписал на гитхабе про баг .. посмотрим че скажут
Кстати можно и так если по быстрому PHP: dd(DB::table('t')->selectRaw(" IF(1=?,1,'2') AS S",[1])->first()->toSql()); А что мешает перевести перевести строку в число? В php это не особо важно для json есть JSON_NUMERIC_CHECK
да ниче не мешает, но имхо это костыли ... не должно так работать пример - только для понимания, там не одна запись а куча, и в json то не отдаю - вот проблема, и использую то не в php далее вот такие пироги, я конечно временный хак сделал - мапнул в коллекции данные значения .... но это как то все не по феншую