И снова здравствуйте! Вот кусочек запроса PHP: $sub1 = DB::table('it_active_my_system_center') ->select('name_of_software', 'number_of_licenses_installed', DB::raw('CONVERT(int, number_of_purchased_licenses) AS Converting')) ->where('display_name', 'not like', 'созданная_1') ->where('number_of_purchased_licenses', 'not like', 'Первая созданная - лицензий куплено') ->whereNotNull('number_of_purchased_licenses'); $sub2 = DB::table(DB::raw('('.$sub1->toSQL().') as res ')) ->select( 'name_of_software', DB::raw('SUM(res.Converting) AS CymmaKyplennihLicense'), DB::raw('SUM(res.number_of_licenses_installed) AS CymmaInstallLicense')) ->groupBy('name_of_software') ->toSQL(); dd($sub2); дает он мне следующий результат: Код (Text): select [name_of_software], SUM(res.Converting) AS CymmaKyplennihLicense, SUM(res.number_of_licenses_installed) AS CymmaInstallLicense from ( select [name_of_software], [number_of_licenses_installed], CONVERT(int, number_of_purchased_licenses) AS Converting from [it_active_my_system_center] where [display_name] not like ? and [number_of_purchased_licenses] not like ? and [number_of_purchased_licenses] is not null) as res group by [name_of_software] Если я вставляю его в management studio то он дает мне результат: Код (Text): name_of_software CymmaKyplennihLicense CymmaInstallLicense Hewlett-Packard 16 30 Обновление от Intel 2 6 Обновление от Intel 1 2 а если в laravel я меняю toSQL() на get() то dd($sub2) выкидывает мне ошибку Код (Text): SQLSTATE[07002]: [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect or syntax error (SQL: select [name_of_software], SUM(res.Converting) AS CymmaKyplennihLicense, SUM(res.number_of_licenses_installed) AS CymmaInstallLicense from (select [name_of_software], [number_of_licenses_installed], CONVERT(int, number_of_purchased_licenses) AS Converting from [it_active_my_system_center] where [display_name] not like ? and [number_of_purchased_licenses] not like ? and [number_of_purchased_licenses] is not null) as res group by [name_of_software]) Я в ступоре ищу помощи. $sub1 корректно работает и в toSQL() и в get() выдает правильный результат. Я проверял по студии. Заранее благодарен.
Не подставляются значения. Это не так тривиально их туда подставить. Слушай, ну если запрос хреново ложится на Query Builder, сделай без, в чём проблема? На Query Builder-е не сошёлся свет клином. --- Добавлено --- https://laravel.com/docs/master/database#running-queries - этот функционал не просто так описали.
@mkramer не спорю, но хочу понять как с ним обращаться я же учусь.... что нужно сделать, можешь кинуть ссылку как это сделать или обьяснить на словах?
Ну это и мне думать надо. Но если бы в моём проекте такое попалось, я бы не стал делать Query Builder-ом без очень веских причин
Может пригодиться, вот так я делал join с подзапросом: PHP: $query->join(\DB::raw('(' . $subQuery->toSql() . ') AS crm_dph1'), function (JoinClause $joinClause) use ($subQuery) { $joinClause->on("dph1.deal_id", "=", "entity_links.entity_id2")->addBinding($subQuery->getBindings()); }); addBindings - это чтобы вместо вопросов в подзапросе встали все нужные данные --- Добавлено --- подзапрос в from мне в проектах на Laravel ещё не попадался.
Как такой вариант с точки зрения правильности? PHP: $param1 = 'созданная_1'; $param2 = 'Первая созданная - лицензий куплено'; $where1 = "display_name not like '".$param1."'"; $where2 = "number_of_purchased_licenses not like '".$param2."'"; $sub1 = DB::table('it_active_my_system_center') ->select('name_of_software', 'number_of_licenses_installed', DB::raw('CONVERT(int, number_of_purchased_licenses) AS Converting')) ->whereRaw($where1) ->whereRaw($where2) ->whereNotNull('number_of_purchased_licenses'); $sub2 = DB::table(DB::raw('('.$sub1->toSQL().') as res ')) ->select( 'name_of_software', DB::raw('SUM(res.Converting) AS CymmaKyplennihLicense'), DB::raw('SUM(res.number_of_licenses_installed) AS CymmaInstallLicense')) ->groupBy('name_of_software') ->get(); dd($sub2);
данные от пользователя в данном случае не пойдут, а чем хреново если от пользователя? addBinding() дает 1 параметр верно я понял? а если несколько параметров то mergeBindings() и в массив я передаю все свои параметры? по принципу (projectid, stepresultid,state,dt1,dt2,changed_by,changed_date) values (@0,@1,@4,@2,@3,@5,getdate())?
SQL-инъекции --- Добавлено --- Я так понял, что addBinding от одного запроса, mergeBindings - от нескольких. Пробуй, этот момент не сильно документирован к сожалению. Главное, чтоб игра свеч стоила. В моём случае без Query Builder-а было не обойтись, поэтому я раскопал в буржуйнете. В другом случае написал бы сам, или может, разложил бы на 2 запроса. Почитай исходники, хотя у Laravel они не самые понятные на свете, но разобраться можно.