4 个连接 + 3 个 where 子句 (Laravel5.7) 的查询生成器正确语法

Query builder proper sintax for 4 joins + 3 where clauses (Laravel5.7)

我正在尝试让这个 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 抛出消息 "syntax error, unexpected '->' (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);

错误: 错误异常 (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 和 WHERE 创建函数吗? 运行 没主意了。预先感谢您的见解:)

事实证明,查询是直接从控制器发送到变量,而不是视图。 我这样做只是为了测试,但它使用了太多内存和 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; ?> 

或者以任何你想要的方式展示它。 有时最好让另一个项目仅用于单独测试。