Bonjour,
j'ai besoin d'aide pour finir une requete SQL avec jointure SVP.
_J'ai la table 'articles' avec comme colonnes : id, title, content, slug, user_id_created_at, user_id_updated_at…
la colonne 'user_id_created_at' est l'id de l'utilisateur qui a créé l'article.
la colonne 'user_id_updated_at' est l'id de l'utilisateur qui fait la dernière modification à l'article.
_J'ai la table 'users' avec comme colonnes : id, username email…
Lorsque dans mon Admin on edit un article, je souhaite afficher l'username de l'utilisateur qui a créé l'article, et l'username de l'utilisateur qui fait la dernière modification à l'article.
Extrait de ma vue :
1 2 3 4 5 | Date de création : <?php echo $package->getCreatedAt(); ?> par <?php echo $package->getUserJoinedCreatedAt()->username; ?> Dernière modification : <?php echo $package->getUpdatedAt(); ?> par <?php echo $package->getUserJoinedUpdatedAt()->username; |
Dans mon Model Article (c'est ici le conflit) :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <?php /** * Méthode dans model Article * * @param int $id - ID de l'article * @return Article - article avec User join */ public function getWithUserJoined($id) { $sql = "SELECT ".self::getTable().".*, ".User::getTable().".username as userJoinedCreatedAt, ".User::getTable().".username as userJoinedUpdatedAt FROM ".self::getTable()." LEFT JOIN ".User::getTable()." ON ".self::getTable().".user_id_created_at = ".User::getTable().".id OR ".self::getTable().".user_id_updated_at = ".User::getTable().".id WHERE ".self::getTable().".id = ? LIMIT 1"; $query = $this->db()->prepare($sql); $query->bindValue(1, $id, PDO::PARAM_INT); $query->execute(); $object = new self(); $object->userJoinedCreatedAt = new User(); $object->userJoinedUpdatedAt = new User(); foreach ($query as $queryLine) { foreach ($queryLine as $property => $value) { if ($property == 'userJoinedCreatedAt') { $object->userJoinedCreatedAt->username = $value; } elseif ($property == 'userJoinedUpdatedAt') { $object->userJoinedUpdatedAt->username = $value; } else { if (property_exists($this, $property)) { $object->$property = $value; } } } } return $object; } |
Le problème : Dans l'état actuel des choses, si par exemple l'utilisateur qui a créé l'article a pour username 'user_test_1', et que l'utilisateur qui fait la dernière modification à l'article a pour username 'user_test_2', c'est 'user_test_1' qui s'affiche a date de dernière modification.
Il y a un conflit au niveau de la requete SQL (soit au niveau du LEFT JOIN, ou soit au niveau des colonnes que je select). Mais je n'arrive pas à résoudre le problème.
Merci.