Laravel查询生成器

时间:2015-10-29 09:15:34

标签: php mysql laravel query-builder

我在使用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 ItemNofilteredPrices = ItemNo上的'SELECT * FROM price AS filteredPrices'附近使用正确的语法。第1行(SQL:选择Description_DEUDescription_ENGDescription_FRADescription_ESPDescription_ITAPriceIdQuantity,{来自PricePerItem的{​​1}},PriceSheet_Idarticlesarticles上加入SELECT * FROM价格AS filteredPrices。ItemNo = filteredPrices。{ {1}} ItemNumber = 1)

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();