IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

[Doctrine] requete sur 3 tables avec une difference


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    rib
    rib est déconnecté
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Par défaut [Doctrine] requete sur 3 tables avec une difference
    j'ai 3 tables,
    1:artist
    2:artist_have_links
    3:artists_links
    voici le shema.yml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    Artists:
      connection: doctrine
      tableName: artists
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        nom:
          type: string(20)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        id_facebook:
          type: string(30)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        bio:
          type: string(5000)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        ordre:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        ArtistsHaveLinks:
          local: id
          foreign: id_artist
          type: many
    ArtistsHaveLinks:
      connection: doctrine
      tableName: artists_have_links
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        id_artist:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        id_links:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        url_link_artist:
          type: string(100)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
        ordre:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        Artists:
          local: id_artist
          foreign: id
          type: one
        ArtistsLinks:
          local: id_links
          foreign: id
          type: one
    ArtistsLinks:
      connection: doctrine
      tableName: artists_links
      columns:
        id:
          type: integer(4)
          fixed: false
          unsigned: false
          primary: true
          autoincrement: true
        type:
          type: string(20)
          fixed: false
          unsigned: false
          primary: false
          notnull: true
          autoincrement: false
      relations:
        ArtistsHaveLinks:
          local: id
          foreign: id_links
          type: many
    comment puis je obtenir facilement la liste des type de liens pour un artiste donné, cette liste de type ne devra pas comporté les liens qui on déjà été assigner a cet artiste. Je pense que la solution réside dans une requête imbriquée mais la je cale. Si quelqu'un pouvait m'aiguiller vers une solution je lui en serait reconnaissant.

    Merci d'avance.

  2. #2
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut
    N'avait-on pas déjà regardé et commenté ton schéma ensemble ?

    Il m'a induit d'erreur ! En effet, le nom des tables est trompeur et laisse a penser à une liaison n-n sémantique entre artist et artist link. Hors le poids de la table artistHaveLink fait que cette liaison n'est pas justifiable en directe.

    Je pense que tu aurais intérêt à renommer tes tables ainsi :

    • Artists -> Artist
    • ArtistsHaveLinks -> ArtistLink
    • ArtistsLinks -> LinkType

    Comme d'habitude, en doctrine le nom représente un objet, pas l'ensemble, il doit donc être au singulier.


    Pour ta requête, une fois la structure comprise, la solution est simple. Je vais te mettre sur la piste, si tu ne trouves pas, je te donne la solution dans la foulée.

    Il faut bien voir que la requêtes part de la table ArtistsLinks vu que c'est ça que tu recherches. En fait tu veux en réponse une liste de ArtistsLinks sans les links d'un user particulier.

    Donc il faut une requête qui retourne lesArtistsLinks sauf ceux qui sont dans la liste des types d'un utilisateur.

    En DQL tu vas utiliser le where() et dans celui-ci une condition SQL sur "pas dans" qui est "! IN ()".

    La particularité intervient ici, il faut inclure entre les parenthèses du IN une requête qui retourne les codes de l'utilisateur en question. Sauf que cette requête doit être écrite en SQL (en effet, le DQL ne peut écrire de sous requête dans une requête). Il faudra donc veiller à utiliser les nom de champs et les nom de tables défini dans la base (et pas dans le schéma), ceux-ci n'étant pas traduit. La requête ne doit retourner qu'un champ, le "id_links". A mon avis, elle ne doit être basée que sur une table.

    Dans cette sous requête, tu auras un argument variable, l'Id de ton utilisateur, qui sera remplacé par un "?" qui, lui, va remonter au niveau de la méthode where() pour récupérer l'Id en question where('... IN (SELECT ... ? ...', $Id)

  3. #3
    rib
    rib est déconnecté
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Par défaut
    je pense avoir trouver une solution a mon probleme,
    NOT IN (Select ...) dans la clause where.
    doctrine permet'il de faire une soustraction entre deux doctrine collection en fonction d'un champs donné?
    je m'explique:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $table = Doctrine_Core::getTable('App_Models_Artists');
    $artist = $table->findOneById($id);
    $link_artist = $artist->ArtistsHaveLinks;
     
    $table =Doctrine_Core::getTable('App_Models_ArtistsLinks');
    $link_server = $table->fetchAll();
    i me faudrait qqch comme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $links_a_affischer = $link_server - $link_artist
    puije arriver a ce resultat en manipulant les doctrine collection($link_artist & $link_server)

    ou suije obligé de passer par une requete sql imbriquée avec la clause NOT IN?

  4. #4
    rib
    rib est déconnecté
    Membre confirmé
    Inscrit en
    Janvier 2005
    Messages
    70
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 70
    Par défaut
    bon j'ai reussi avec cette requete sql:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT type, id FROM artists_links
    where id NOT IN (Select id_links FROM artists_have_links WHERE id_artist = 1)
    et encore merci pour le coup de main.

  5. #5
    Expert confirmé
    Avatar de Michel Rotta
    Homme Profil pro
    DPO
    Inscrit en
    Septembre 2005
    Messages
    4 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : DPO
    Secteur : Distribution

    Informations forums :
    Inscription : Septembre 2005
    Messages : 4 954
    Par défaut


    Reste a cliquer sur

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Impossible d'envoi une requete sur ma table avec les button
    Par naijik dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 11/05/2015, 23h51
  2. Réponses: 4
    Dernier message: 23/10/2006, 09h09
  3. [MySQL] Requete sur 2 tables avec champs commun
    Par marcd dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/04/2006, 16h14
  4. aide pour requete sur 2 tables avec clé étranere
    Par richton95 dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/12/2005, 13h32
  5. besoin d'aide -> requete sur 2 tables avec count()
    Par parksto dans le forum Requêtes
    Réponses: 3
    Dernier message: 20/10/2005, 19h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo