Jointure entre les tables

a marqué ce sujet comme résolu.

Bonjour,

Je possède deux classes, User.php et Document.php. Voici leurs définitions :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
class User {
  private $_user_id;
  private $_pseudo;
  private $_email;
  private $_hashpass;
  private $_fname;
  private $_lname;
  private $_admin;

  // Je vous épargne les méthodes
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
<?php
class Document {
  private $_document_id;
  private $_author;
  private $_name;
  private $_upload_date;
  private $_category;
  private $_level;
  private $_subject;

  // Je vous épargne les méthodes
}

J’ai également les deux tables dans ma base qui reprennent exactement les noms des propriétés sans le _. La propriété $_author de l’objet Document prend en valeur $user_id de l’objet User, je lie ainsi mes données.

J’aimerais maintenant faire un tableau listant tous les documents uploadés. Seulement, si je récupère juste mes données de la table Document je vais me retrouver juste avec les user_id… J’aimerais donc pouvoir avoir l’objet User directement dans mon objet Document pour pouvoir accéder a ses informations (notamment son pseudo pour mon tableau).

Il faut donc que j’utilise des jointures SQL. Mais je vois pas du tout comment les faire fonctionner ici… J’ai l’impression d’avoir un problème de conception.

Merci à vous ! :)

+0 -0

Justement. J’ai essayé cette requête qui semble fonctionner :

1
SELECT d.*, u.* FROM Documents d INNER JOIN Users u ON d.author = u.user_id ORDER BY d.upload_date DESC

Mais j’ai une question. Comment j’accède aux données ? Si je fais $data[0]['id'] il va y avoir un conflit entre l’id du document et l’id du user non ?

EDIT : Je n’ai rien dit, ma requête ne fonctionne qu’à moitié. Voici ce qu’elle me renvoie :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php
array(
  'id' => 3,
  'document_id' => '5874e514671ce',
  'author' => '5874e514671cd',
  'name' => 'Doc test',
  'upload_date' => '2017-01-11 07:33:13',
  'category' => 'test',
  'level' => 'test',
  'subject' => 'test',

  'user_id' => '5874e514671cd',
  'pseudo' => 'Foobar',
  'email' => 'foo.bar@localhost.fr',
  'hashpass' => '$2y$10$dkxWFGYxyzpk/LpTgn7S2.4h4QkTbDbCQ2v/uImcl9CyqbXkwCyyq',
  'fname' => 'Foo',
  'lname' => 'Bar',
  'admin' => 1
)

Or dans ma table j’ai plus qu’un seul document. :/

+0 -0

Justement. J’ai essayé cette requête qui semble fonctionner :

1
SELECT d.*, u.* FROM Documents d INNER JOIN Users u ON d.author = u.user_id ORDER BY d.upload_date DESC
Wizix

Je n’ai jamais vu la syntaxe d.*. Quelle est son utilité ? De mon point de vue, ça sélectionne tous les champs commençant par d. Sinon, la requête me paraît bonne.

Mais j’ai une question. Comment j’accède aux données ? Si je fais $data[0]['id'] il va y avoir un conflit entre l’id du document et l’id du user non ?

Wizix

Il ne s’agit pas de variables mais de clé donc en principe, il n’y aura pas de soucis. (Je préfère demander confirmation aux autres par contre.)

EDIT : Je n’ai rien dit, ma requête ne fonctionne qu’à moitié. Voici ce qu’elle me renvoie :

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php
array(
  'id' => 3,
  'document_id' => '5874e514671ce',
  'author' => '5874e514671cd',
  'name' => 'Doc test',
  'upload_date' => '2017-01-11 07:33:13',
  'category' => 'test',
  'level' => 'test',
  'subject' => 'test',

  'user_id' => '5874e514671cd',
  'pseudo' => 'Foobar',
  'email' => 'foo.bar@localhost.fr',
  'hashpass' => '$2y$10$dkxWFGYxyzpk/LpTgn7S2.4h4QkTbDbCQ2v/uImcl9CyqbXkwCyyq',
  'fname' => 'Foo',
  'lname' => 'Bar',
  'admin' => 1
)

Or dans ma table j’ai plus qu’un seul document. :/

Wizix

Est-il possible d’avoir le morceau de PHP qui permet de récupérer ces données ?

Je n’ai jamais vu la syntaxe d.*. Quelle est son utilité ? De mon point de vue, ça sélectionne tous les champs commençant par d. Sinon, la requête me paraît bonne.

Sélectionner tous les champs de la table Documents sur laquelle j’ai mis un label d. Mais j’avoue que je sais pas si c’est possible. :-°

Est-il possible d’avoir le morceau de PHP qui permet de récupérer ces données ?

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
public function getAll() {
  $sql = 'SELECT d.*, u.* FROM Users u INNER JOIN Documents d ON d.author = u.user_id ORDER BY d.upload_date DESC';
  $q = $this->_db->prepare($sql);
  $q->execute();
  $docs = [];

  die(var_export($q->fetch(\PDO::FETCH_ASSOC, true)));

  // La suite je verrais plus tard, pour le moment j'essaye de récupérer toutes mes données ;)
  while ($data = $q->fetch(\PDO::FETCH_ASSOC)) {
    $docs[] = new \App\Models\Document($data);
  }

  return $docs;
}

Ton die ne montrera qu’une ligne : fetch = 1 ligne. Sinon c’est un fetchAll qu’il faut mettre à ce niveau pour toutes les voir.

Si je fais $data[0]['id'] il va y avoir un conflit entre l’id du document et l’id du user non ?

Oui. Utilises un alias pour au moins l’un d’eux. Il y a bien le mode PDO::FETCH_NAMED qui donnerait un sous-tableau pour la clé id mais il faut encore le traiter derrière et tu ne sais pas forcément quoi est quoi (ici, si avec d.*, u.*, $data[...]['id'][0] sera Document.id vs en $data[...]['id'][1] Users.id)

+2 -0

Merci, ça fonctionne bien effectivement ! Mais du coup vient une nouvelle question. Pour chaque document je créé un user. Ça signifie que si un utilisateur envoie 50 documents, j’aurais 50 instances de cet utilisateur. Je me demandais si c’était un problème ?

Merci à vous. :)

Connectez-vous pour pouvoir poster un message.
Connexion

Pas encore membre ?

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