Aide pour finir une requete SQL "complexe"

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

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.

Édité par artragis

Auteur du sujet

Du coup, sujet résolu. j'ai trouvé le conflit. voici la requete qui marche :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
$sql = "SELECT
            ".self::getTable().".*,
            user_a.username as userJoinedCreatedAt,
            user_b.username as userJoinedUpdatedAt
        FROM ".self::getTable()."
        LEFT OUTER JOIN ".User::getTable()." as user_a
            ON ".self::getTable().".user_id_created_at = user_a.id
        LEFT OUTER JOIN ".User::getTable()." as user_b
            ON ".self::getTable().".user_id_updated_at = user_b.id
        WHERE ".self::getTable().".id = ?
        LIMIT 1";

Il suffisais mettre des alias pour éviter le conflit.

Édité par artragis

Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte