如何修复Laravel查询生成器,其中子句整数变量转换为字符串

时间:2019-06-06 08:50:19

标签: laravel laravel-query-builder

我有一个函数,用于传递语言编号,以获取用于API用途的语言类别记录。我使用数据库查询语句选择类别表,并加入类别语言表以获取类别ID,parent_id和名称(指定语言)。执行返回错误并选择基础SQL时,会将语言值转换为字符串(例如languages_id = 1)。我在Google上搜索了很多,却不知道怎么了。任何人都可以建议如何解决。非常感谢。

我试图将基础SQL复制到MySQL Workbench并删除languages_id = 1-> languages_id = 1可以正常工作。我猜是1引起的错误。

代码示例:

private function getCategories($language) {
    $categories = DB::table('categories')
        ->select(DB::raw('categories.id, categories.parent_id, categories_translation.name'))
        ->join('categories_translation', function($join) use ($language) {
            $join->on('categories_translation.categories_id', '=', 'categories.id');
            $join->on('categories_translation.languages_id', '=', $language);
        })
        ->where([
            ['parent_id' ,'=', '0'],
            ['categories.id', '=', $id]
        ])
        ->get();
    return $categories;
}

错误返回转换后的SQL:

  

“ SQLSTATE [42S22]:找不到列:1054'on中的未知列'1'   子句”(SQL:选择category.id,category.parent_id,   来自categories内部联接的Categories_translation.name   categories_translation上的categories_translationcategories_id =   categoriesidcategories_translationlanguages_id = 1   其中(parent_id = 0和categoriesid = 1))“

2 个答案:

答案 0 :(得分:0)

您正在尝试使用与标量值(而不是列)的比较来join。我认为您实际上想将该比较作为“ where”条件而不是“ join on”

->where([
     ['parent_id' ,'=', '0'],
     ['categories.id', '=', $id],
     ['categories_translation.languages_id', '=', $language]
])

答案 1 :(得分:0)

我用您的代码发现了另一件事。在连接表时,假设您要将“ categories_translation.languages_id”与另一个表ID字段连接在一起。就您而言,事实并非如此。您没有将“ categories_translation.languages_id”与任何表字段结合在一起。所以理想情况下,您要做的就是这个

private function getCategories($language) {

  $categories = DB::table('categories')
                    ->select(DB::raw('categories.id, categories.parent_id, categories_translation.name'))
                    ->join('categories_translation', function($join) use ($language) {            
                    $join->on('categories_translation.categories_id', '=', 'categories.id');    
                    })
                   ->where([
                        ['parent_id' ,'=', '0'],
                        ['categories.id', '=', $id]
                        ['categories_translation.languages_id', '=', $language]
                    ])
                    ->get();
return $categories;

}

希望这会有所帮助