За последние 24 часа нас посетили 22419 программистов и 1027 роботов. Сейчас ищут 689 программистов ...

Запрос в Laravel не работает а в Managemebt studio работает, что не так?

Тема в разделе "Laravel", создана пользователем Feonix89, 6 июл 2018.

  1. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    И снова здравствуйте!
    Вот кусочек запроса
    PHP:
    1. $sub1 = DB::table('it_active_my_system_center')
    2.         ->select('name_of_software',
    3.             'number_of_licenses_installed',
    4.             DB::raw('CONVERT(int, number_of_purchased_licenses) AS Converting'))
    5.         ->where('display_name', 'not like', 'созданная_1')
    6.         ->where('number_of_purchased_licenses', 'not like', 'Первая созданная - лицензий куплено')
    7.         ->whereNotNull('number_of_purchased_licenses');
    8.  
    9.         $sub2 = DB::table(DB::raw('('.$sub1->toSQL().') as res '))
    10.         ->select(
    11.             'name_of_software',
    12.             DB::raw('SUM(res.Converting) AS CymmaKyplennihLicense'),
    13.             DB::raw('SUM(res.number_of_licenses_installed) AS CymmaInstallLicense'))
    14.         ->groupBy('name_of_software')
    15.         ->toSQL();
    16.        
    17.         dd($sub2);
    дает он мне следующий результат:
    Код (Text):
    1. select
    2.     [name_of_software],
    3.     SUM(res.Converting) AS CymmaKyplennihLicense,
    4.     SUM(res.number_of_licenses_installed) AS CymmaInstallLicense
    5. from (
    6.     select
    7.         [name_of_software],
    8.         [number_of_licenses_installed],
    9.         CONVERT(int, number_of_purchased_licenses) AS Converting
    10.     from
    11.         [it_active_my_system_center]
    12.     where
    13.         [display_name] not like ? and
    14.         [number_of_purchased_licenses] not like ? and
    15.         [number_of_purchased_licenses] is not null) as res
    16. group by [name_of_software]
    Если я вставляю его в management studio то он дает мне результат:
    Код (Text):
    1.  
    2. name_of_software    CymmaKyplennihLicense    CymmaInstallLicense
    3. Hewlett-Packard               16                     30
    4. Обновление от Intel          2                      6
    5. Обновление от Intel        1                      2
    а если в laravel я меняю toSQL() на get() то dd($sub2) выкидывает мне ошибку
    Код (Text):
    1. SQLSTATE[07002]: [Microsoft][SQL Server Native Client 11.0]COUNT field incorrect
    2.  or syntax error (SQL: select [name_of_software], SUM(res.Converting) AS CymmaKyplennihLicense,
    3.  SUM(res.number_of_licenses_installed) AS CymmaInstallLicense from (select [name_of_software],
    4.  [number_of_licenses_installed], CONVERT(int, number_of_purchased_licenses) AS Converting from
    5. [it_active_my_system_center] where [display_name] not like ? and [number_of_purchased_licenses]
    6. not like ? and [number_of_purchased_licenses] is not null) as res group by [name_of_software])
    Я в ступоре ищу помощи. $sub1 корректно работает и в toSQL() и в get() выдает правильный результат. Я проверял по студии. Заранее благодарен.
     
  2. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Не подставляются значения. Это не так тривиально их туда подставить. Слушай, ну если запрос хреново ложится на Query Builder, сделай без, в чём проблема? На Query Builder-е не сошёлся свет клином.
    --- Добавлено ---
    https://laravel.com/docs/master/database#running-queries - этот функционал не просто так описали.
     
  3. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    @mkramer не спорю, но хочу понять как с ним обращаться :) я же учусь.... что нужно сделать, можешь кинуть ссылку как это сделать или обьяснить на словах?
     
  4. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Ну это и мне думать надо. Но если бы в моём проекте такое попалось, я бы не стал делать Query Builder-ом без очень веских причин
     
  5. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    ок я понял :) разберусь скину как для обсуждений...
     
  6. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Может пригодиться, вот так я делал join с подзапросом:
    PHP:
    1. $query->join(\DB::raw('(' . $subQuery->toSql() . ') AS crm_dph1'), function (JoinClause $joinClause) use ($subQuery) {
    2.     $joinClause->on("dph1.deal_id", "=", "entity_links.entity_id2")->addBinding($subQuery->getBindings());
    3. });
    addBindings - это чтобы вместо вопросов в подзапросе встали все нужные данные
    --- Добавлено ---
    подзапрос в from мне в проектах на Laravel ещё не попадался.
     
  7. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    Как такой вариант с точки зрения правильности?
    PHP:
    1. $param1 = 'созданная_1';
    2.         $param2 = 'Первая созданная - лицензий куплено';
    3.  
    4.         $where1 = "display_name not like '".$param1."'";
    5.         $where2 = "number_of_purchased_licenses not like '".$param2."'";
    6.  
    7.         $sub1 = DB::table('it_active_my_system_center')
    8.         ->select('name_of_software',
    9.             'number_of_licenses_installed',
    10.             DB::raw('CONVERT(int, number_of_purchased_licenses) AS Converting'))
    11.         ->whereRaw($where1)
    12.         ->whereRaw($where2)
    13.         ->whereNotNull('number_of_purchased_licenses');
    14.  
    15.         $sub2 = DB::table(DB::raw('('.$sub1->toSQL().') as res '))
    16.         ->select(
    17.             'name_of_software',
    18.             DB::raw('SUM(res.Converting) AS CymmaKyplennihLicense'),
    19.             DB::raw('SUM(res.number_of_licenses_installed) AS CymmaInstallLicense'))
    20.         ->groupBy('name_of_software')
    21.         ->get();
    22.        
    23.         dd($sub2);
     
  8. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    Хреново, если данные от пользователя приходят.
     
  9. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    данные от пользователя в данном случае не пойдут, а чем хреново если от пользователя?
    addBinding() дает 1 параметр верно я понял? а если несколько параметров то mergeBindings() и в массив я передаю все свои параметры?
    по принципу (projectid, stepresultid,state,dt1,dt2,changed_by,changed_date) values (@0,@1,@4,@2,@3,@5,getdate())?
     
  10. mkramer

    mkramer Суперстар
    Команда форума Модератор

    С нами с:
    20 июн 2012
    Сообщения:
    8.553
    Симпатии:
    1.754
    SQL-инъекции
    --- Добавлено ---
    Я так понял, что addBinding от одного запроса, mergeBindings - от нескольких. Пробуй, этот момент не сильно документирован к сожалению. Главное, чтоб игра свеч стоила. В моём случае без Query Builder-а было не обойтись, поэтому я раскопал в буржуйнете. В другом случае написал бы сам, или может, разложил бы на 2 запроса. Почитай исходники, хотя у Laravel они не самые понятные на свете, но разобраться можно.
     
  11. Feonix89

    Feonix89 Новичок

    С нами с:
    30 май 2018
    Сообщения:
    113
    Симпатии:
    2
    понял спасибо большое!