Как исправить конструктор запросов Laravel, где целочисленная переменная предложения переводится в строку - PullRequest
0 голосов
/ 06 июня 2019

У меня есть функция для получения пропуска языкового номера, чтобы получить запись языковых категорий для целей API.Я использую оператор запроса к базе данных, чтобы выбрать таблицу категорий, и присоединяюсь к языковой таблице категорий, чтобы получить идентификатор категории, parent_id и имя (указанный язык).При выполнении возвращают ошибку и выбирают базовый SQL, преобразующий значение языка в строку (например, languages_id = 1).Я много гуглю и понятия не имею, что не так.Может кто-нибудь посоветовать, как решить.Большое спасибо.

Я попытался скопировать базовый 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 Неизвестный столбец '1' в 'предложении' (SQL: выберите Categories.id, Categories.parent_id, Categories_translation.name из categories Внутреннее объединение categories_translation в categories_translation. categories_id = categories.id и categories_translation. languages_id = 1 где (parent_id = 0 и categories. id = 1)) "

Ответы [ 2 ]

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

есть еще одна вещь, которую я просто обнаруживаю с помощью вашего кода.при соединении с таблицей предполагается, что вы соединяете 'category_translation.languages_id' с другим полем идентификатора таблицы.в твоем случае это не так.Вы не объединяете файл category_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;

}

надеюсь, что это поможет

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

Вы пытаетесь join использовать сравнение со скалярным значением вместо столбца.Я думаю, что вы действительно хотите поместить это сравнение как условие «где», а не как «соединение»

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