[CakePHP] Column … in order clause is ambiguous

Aujourd’hui, j’ai été confronté à une erreur lors du développement d’Opencomp.

Warning (512): SQL Error: 1052: Column 'name' in order clause is ambiguous 
[<strong>CORE/cake/libs/model/datasources/dbo_source.php</strong>, line <strong>684</strong>]

En regardant le debug de la requête SQL exécutée, j’ai vite compris la source du problème. Mais, comme ce n’est pas forcément évident au premier abord, je poste la solution ici en espérant que ça serve à quelqu’un …

SELECT `Academy`.`id`, `Academy`.`name`, `Academy`.`type`, `Academy`.`user_id`, 
`User`.`id`, `User`.`username`, `User`.`password`, `User`.`first_name`, `User`.`name`, 
`User`.`email`, `User`.`role`, `User`.`created` 
FROM `academies` 
AS `Academy` 
LEFT JOIN `users` 
AS `User` 
ON (`Academy`.`user_id` = `User`.`id`)  
WHERE 1 = 1   
ORDER BY `name` Asc  
LIMIT 20

Ici, nous avons lié deux modèles (c’est à dire deux tables) en créant une association pour indiquer qu’une académie « appartenait » à un utilisateur (le responsable académique).

class Academy extends AppModel
{
     var $belongsTo = 'User';
}

Ensuite, on a indiqué que l’on ne souhaitait que les 20 premiers enregistrements et que l’on souhaitait que ces derniers soient triés par nom (A-Z) en renseignant la variable $paginate.

class AcademiesController extends AppController
{
    var $paginate = array(
        'Academy' => array(
            'limit' => 20,
            'order' => array(
                'name' => 'Asc'
            )
        )
    );

...

Seulement voilà, comme nous le fait savoir MySQL, la requête que nous souhaitons exécuter est ambigüe. En effet ORDER BY `name` Asc LIMIT 20 n’indique pas de quelle colonne name il s’agit. Comme nous avons associés deux modèles, il y a maintenant deux colonnes appelées name : le nom de famille de l’utilisateur et le nom de l’académie. Il faut donc préciser à CakePHP le modèle correspondant à la colonne nameselon laquelle on souhaite effectuer le tri.

class AcademiesController extends AppController
{
    var $paginate = array(
        'Academy' => array(
            'limit' => 20,
            'order' => array(
                'Academy.name' => 'Asc'
            )
        )
    );

...

A propos Jean Traullé

Passionné par l'informatique et les nouvelles technos, miagiste, papa de opencomp.fr, #sysadm, #ProxmoxVE, #Docker, #TYPO3, #CakePHP enthousiaste 😊
Ce contenu a été publié dans Non classé, avec comme mot(s)-clé(s) , . Vous pouvez le mettre en favoris avec ce permalien.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *