Собственный синтаксис в построителе запросов для 4 объединений + 3, где предложения (Laravel5.7) - PullRequest
0 голосов
/ 04 июня 2019

Я пытаюсь заставить этот запрос MySQL работать в laravel 5.7 построитель запросов . Работает нормально в phpmyadmin

SELECT c.Symbol
, s.SectorName
, cprs.strenght
, s.parentid
, ssbpi.Risklevel 
, ssbpi.ColumnType
FROM Companies AS c
JOIN Sectors AS s ON s.SectorID = c.SectorID
JOIN Company_PriceRS AS cprs ON cprs.CompanyID = c.CompanyID
JOIN SubSectorsBPIsData AS ssbpi ON ssbpi.subcategoryid = s.parentid
WHERE cprs.PostDate = '2017-05-08'
AND WHERE CompanyPriceRS.strenght = 'strong'
AND WHERE SubSectorsBPIsData.ColumnType = $ColumnType 

ColumnType - это переменная, которая появляется из раскрывающегося списка, и она уже записана и работает правильно.

Я пробовал нормальный способ согласно документации:

$Completequerytry1 = DB::table('Companies')
 ->join('Sectors', 'Sectors.SectorID', '=', 'Companies.SectorID')
 ->join('CompanyPriceRS', 'CompanyPriceRS.CompanyID', '=', 'Companies.CompanyID')  
 ->$join('SubSectorsBPIsData ', 'SubSectorsBPIsData.subcategoryid', '=', 'Sectors.parentid')

 ->where('CompanyPriceRS.strenght', '=', 'strong')    
 ->where('SubSectorsBPIsData.ColumnType', '=', $ColumnType) 
 ->where('CompanyPriceRS.Postdate', '=', '2017-05-08'); 
 ->select('Companies.Symbol', 'Sectors.SectorName', 'CompanyPriceRS.strenght', 'Sectors.parentid', 'SubSectorsBPIsData.subcategoryid','SubSectorsBPIsData.ColumnType')
  ->limit(10);
->select('Companies.Symbol', 'Sectors.SectorName', 'CompanyPriceRS.strenght', 'Sectors.parentid', 'SubSectorsBPIsData.subcategoryid','SubSectorsBPIsData.ColumnType')
 ->limit(10);
echo '<pre>';
print_r($Completequerytry1);

Ошибка: Symfony \ Component \ Debug \ Exception \ FatalThrowableError, выдаваемая с сообщением «синтаксическая ошибка, неожиданная '->' (T_OBJECT_OPERATOR)"

  1. Использование функций с несколькими вложенными объединениями:
$Completequerytry1 = DB::table('Companies')
->join('Sectors', function ($join) use ($ColumnType) {
 $join->on('Sectors.SectorID', '=', 'Companies.SectorID')   
->join('CompanyPriceRS', function ($join2) { 
  $join2->on('CompanyPriceRS.CompanyID', '=', 'Companies.CompanyID')  
  ->join('SubSectorsBPIsData', function ($join3)  { 
  $join3->on('SubSectorsBPIsData.subcategoryid', '=', 'Sectors.parentid')

 ->where(function ($query1)  {
   $query1->where('CompanyPriceRS.strenght', '=', 'strong')  //filter 1
          ->where('SubSectorsBPIsData.ColumnType', '=', $ColumnType) //filter2
           ->where('CompanyPriceRS.Postdate', '=', '2017-05-08'); // filter 3
        });
    });    
});
})
->select('Companies.Symbol', 'Sectors.SectorName', 'CompanyPriceRS.strenght', 'Sectors.parentid', 'SubSectorsBPIsData.subcategoryid','SubSectorsBPIsData.ColumnType')
 ->limit(10);
echo '<pre>';
print_r($Completequerytry1);

Ошибка: ErrorException (E_NOTICE) Неопределенная переменная: ColumnType

3: затем пробовал функции с вложенным WHERE

$Completequerytry1 = DB::table('Companies')
 ->join('Sectors', 'Sectors.SectorID', '=', 'Companies.SectorID')
 ->join('CompanyPriceRS', 'CompanyPriceRS.CompanyID', '=', 'Companies.CompanyID')  
 ->$join('SubSectorsBPIsData ', 'SubSectorsBPIsData.subcategoryid', '=', 'Sectors.parentid') //ERROR IS GIVEN ON THIS LINE

 ->where(function ($query1)  {
 $query1->where('CompanyPriceRS.strenght', '=', 'strong')    
         ->where('SubSectorsBPIsData.ColumnType', '=', $ColumnType) 
         ->where('CompanyPriceRS.Postdate', '=', '2017-05-08'); 
   });

->select('Companies.Symbol', 'Sectors.SectorName', 'CompanyPriceRS.strenght', 'Sectors.parentid', 'SubSectorsBPIsData.subcategoryid','SubSectorsBPIsData.ColumnType')
 ->limit(10);
echo '<pre>';
print_r($Completequerytry1);

Ошибка: неопределенная переменная: join

Все еще не знаю, чего мне не хватает. Должен ли я создавать функции для соединений и ГДЕ? Кончаются идеи. Заранее благодарим за ваши идеи :) 1038 *

1 Ответ

0 голосов
/ 19 июня 2019

Оказывается, запрос отправлялся в переменную напрямую из контроллера, а не в представление.Я делал это только для тестирования, но он использовал слишком много памяти с функцией print_r();, что делало невозможным получение результата.Даже при использовании dd(); я не получал то, что хотел (думаю, это из-за некоторых ошибок синтаксиса, которые у меня были).Итак, я передал последнюю переменную в представление, и она отлично работает, поскольку laravel может обрабатывать данные по-разному.Также я использовал ->limit(10);, чтобы разделить результаты и избежать перегрузки памяти.Вот окончательный рабочий код:

$Completequerytry1 = DB::table('Companies')
->join('Sectors', 'Sectors.SectorID', '=', 'Companies.SectorID')
->join('Company_PriceRS', 'Company_PriceRS.CompanyID', '=', 'Companies.CompanyID')
->join('SubSectorsBPIsData', 'SubSectorsBPIsData.subcategoryid', '=', 'Sectors.parentid')
->select('Sectors.SectorName', 'Companies.Symbol', 'Company_PriceRS.strenght', 'Sectors.parentid', 'SubSectorsBPIsData.Risklevel','SubSectorsBPIsData.ColumnType')

->where('Company_PriceRS.strenght', '=', 'strong')    
->where('SubSectorsBPIsData.ColumnType', '=','X') 
->where('Company_PriceRS.Postdate', '=', '2017-05-08') 
->limit(10)
->get();
return view('besttrades2', array('Completequerytry1' => $Completequerytry1)); //sending my query variable to the view

Тогда в представлении используется только:

<?= $Completequerytry1; ?> 

или покажите его любым удобным для вас способом.Иногда лучше иметь другой проект только для тестирования отдельно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...