我在使用Laravel Query Builder时遇到了一些麻烦。 我想转换此SQL查询:
SELECT ItemNo, Description_DEU AS DescDE, Description_ENG AS DescEN, Description_FRA AS DescFR, Description_ESP AS DescES, Description_ITA AS DescIT, PriceId, Quantity, PricePerItem, PriceSheet_Id AS SheetId
FROM articles
LEFT JOIN (SELECT * FROM price WHERE PriceSheet_Id = :$variable) AS filteredPrices
ON articles.ItemNo = filteredPrices.ItemNumber
我尝试了以下操作:
$results = DB::table('articles')
->select('ItemNo', 'Description_DEU', 'Description_ENG', 'Description_FRA', 'Description_ESP', 'Description_ITA', 'PriceId', 'Quantity', 'PricePerItem', 'PriceSheet_Id')
->leftJoin(DB::raw('SELECT * FROM price AS filteredPrices'), function($join) {
$join->on('articles.ItemNo', '=', 'filteredPrices.ItemNumber');
})
->where('PriceSheet_Id', '=', $var)
->get();
但它仍然告诉我,我在某处有语法错误。任何帮助将不胜感激。
错误MSG:= SQLSTATE [42000]:语法错误或访问冲突:1064 SQL语法中有错误;检查与您的MySQL服务器版本相对应的手册,以便在articles
ItemNo
。filteredPrices
= ItemNo
上的'SELECT * FROM price AS filteredPrices'附近使用正确的语法。第1行(SQL:选择Description_DEU
,Description_ENG
,Description_FRA
,Description_ESP
,Description_ITA
,PriceId
,Quantity
,{来自PricePerItem
的{1}},PriceSheet_Id
,articles
在articles
上加入SELECT * FROM价格AS filteredPrices。ItemNo
= filteredPrices
。{ {1}} ItemNumber
= 1)
答案 0 :(得分:0)
要构建SQL查询,您应该将where条件放在raw子查询中,并将子查询别名以在ON中引用它:
$results = DB::table('articles')
->select('ItemNo', 'Description_DEU', 'Description_ENG', 'Description_FRA', 'Description_ESP', 'Description_ITA', 'PriceId', 'Quantity', 'PricePerItem', 'PriceSheet_Id')
->leftJoin(DB::raw('(SELECT * FROM price AS filteredPrices WHERE PriceSheet_Id = ' . $var .') as filteredPrices'), function($join)
{
$join->on('articles.ItemNo', '=', 'filteredPrices.ItemNumber');
})
->get();