Ошибка CakePHP 3: SQLSTATE [42000]: синтаксическая ошибка или нарушение прав доступа: 1064

Я получаю эту ошибку:

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AS `Colleges__*` FROM college_admins CollegeAdmins LEFT JOIN colleges Colleges O' at line 1

Вот запрос SQL, который дает эту ошибку:

SELECT Colleges.* AS `Colleges__*` FROM college_admins CollegeAdmins LEFT JOIN colleges Colleges ON Colleges.id = (CollegeAdmins.college_id) WHERE CollegeAdmins.user_id = :c0 LIMIT 20 OFFSET 0

Я включил quoteIdentifiers config\app, но это приводит к этой новой ошибке:

Error: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'AS `Colleges__*` FROM `college_admins` `CollegeAdmins` LEFT JOIN `colleges` `Col' at line 1

где запрос становится:

SELECT `Colleges`.* AS `Colleges__*` FROM `college_admins` `CollegeAdmins` LEFT JOIN `colleges` `Colleges` ON `Colleges`.`id` = (`CollegeAdmins`.`college_id`) WHERE `CollegeAdmins`.`user_id` = :c0 LIMIT 20 OFFSET 0

Я думаю, что в качестве ключевого слова «COL» используется «Col from Colleges», но я не уверен. Как это исправить?

Это код CakePHP, который генерирует запрос MySQL:

return $college_admins->find()
    ->select(['Colleges.*'])
    ->leftJoinWith('Colleges')
    ->where(['CollegeAdmins.user_id' => $userId]);

person nparabz    schedule 10.02.2016    source источник


Ответы (2)


Вы не можете использовать Colleges.* в запросе CakePHP ORM (CakePHP 3.x). Как вы заметили, это создает неправильные псевдонимы SQL, такие как Colleges__*. Вместо того, чтобы выбрать все столбцы таблицы, вам нужно передать объект таблицы.

Итак, вы, вероятно, захотите сделать что-то вроде: -

->select($college_admins->Colleges)

Предполагая, что Colleges связан с вашей таблицей CollegeAdmins.

person drmonkeyninja    schedule 10.02.2016
comment
Колледжи IS связаны с CollegeAdmins. И ваше решение тоже сработало. Это убрало ошибки. Спасибо. Но как ваше решение, так и приведенное выше, показывают строки с пустыми значениями. Я разместил это в отдельном вопросе здесь. Пожалуйста, проверьте это, если вы можете помочь в этом: колледжи, принадлежащие администраторам"> stackoverflow.com/questions/35321261/ - person nparabz; 10.02.2016

Вы не можете использовать псевдоним Colleges.*, так как это относится ко всем столбцам в таблице Colleges, а псевдонимы относятся к одному столбцу (или таблице, или подзапросу). Вам необходимо перечислить все поля в таблице колледжей и предоставить псевдоним для каждого из них, например

select colleges.ig as colleges_id, colleges.field1 as colleges_field1, ...

В sql нет синтаксиса для предоставления псевдонима таким образом. Что вы можете попытаться сделать, так это получить доступ к метаданным, возвращаемым mysql в php, чтобы получить имя таблицы для каждого поля.

person Shadow    schedule 10.02.2016
comment
Ok. Это исправило это. Спасибо. - person nparabz; 10.02.2016