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

Symfony PHP Discussion :

Problème relation n-m


Sujet :

Symfony PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut Problème relation n-m
    Bonjour,

    J'ai un problème tout simple avec une relation m-n.
    Pour exemple, voici un schema:

    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
     
    User:
      columns:
        name: varchar(150)
        email: varchar(150)
        phone: varchar(20)
      relations:
        Media:
          refClass: Loan
          local: user_id
          foreign: media_id
     
     
    Media:
      columns:
        title: varchar(150)
        author: varchar(150)
        summary: varchar(1000)
      relations:
        User:
          refClass: Loan
          local: media_id
          foreign: user_id
     
    Loan:
      actAs:
        Timestampable
      columns:
        media_id:
          type: integer
          primary: true
        user_id:
          type: integer
          primary: true
    Comment faire pour associer un media à un nouveau user?
    Ma table contient déjà des données.

    Avec le code suivant, ca ne fonctionne pas (User.class.php):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $this->setName('Bob')
           ->setEmail('dfsfsd@fdsfd.fr')
           ->setPhone('31564')
           ->setMedia(3)
           ->save();
    Je voudrais lier le User au Media dont l'id est 3, et donc dans la table Loan on ait une ligne qui lie le User au livre 3.

    Mais ça me retourne :
    Unknown method User::setMedia

    Comment faire?

  2. #2
    Membre confirmé Avatar de speedy_g
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 213
    Par défaut
    Le message d'erreur à l'air clair.

    La méthode setMedia n'est pas définie dans la classe User.
    Il faut l'implémenter donc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class User 
    .
    .
    .
    . 
    public function setMedia($in)
    {
     
    }

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    Je ne pensais pas que le message venait de là.

    Les autres méthodes (setName(), etc...) viennent de la définition du schéma, alors pourquoi pas setMedia??

    Donc selon toi, il faudrait que je crée une méthode setMedia(), avec laquelle je crée un nouvel enregistrement dans la table Loan, un peu comme cela ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function setMedia($user)
    {
        $loan = new Loan();
        $loan->setUserId($user)
               ->serMediaId(3)
               ->save();
    }

  4. #4
    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
    Ton schéma corrigé pour fonctionner en relation n-n
    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
     
    User:
      columns:
        name: varchar(150)
        email: varchar(150)
        phone: varchar(20)
     
    Media:
      columns:
        title: varchar(150)
        author: varchar(150)
        summary: varchar(1000)
      relations:
        Users:
          refClass: Loan
    	  class: User
    	  foreignAlias: Medias
     
    Loan:
      options:
        symfony:
          form: false
          filter: false
      actAs:
        Timestampable
      columns:
        media_id:
          type: integer(8)
          primary: true
        user_id:
          type: integer(8)
          primary: true
       relations:
          User:
            foreignAlias: Loans
          Media:
            foreignAlias: Loans
    Note :
    [LIST][*]Il n'est pas nécessaire de définir une relation des deux côtés de la relations, donc User n'a plus de relations[*]La relation dans Media : "refClass" est la classe doctrine qui va définir la double liaison ; "class" est la classe doctrine de l'autre côté de la relation double ; "foreignAlias:" est le nom de la méthode doctrine du côté "User" de la relation (note le 's' qui indique qu'il y a plusieurs "Medias" pour un "User" ; dernière subtilité le nom de la relation "Users" avec un 's' qui est le nom de la méthode doctrine du côté "Media" de la relation, même remarque pour le 's'.[*]la partie "options:", "symfony:" n'est pas utilisé par doctrine, elle indique à symfony de ne pas créer les objets "form" et "filter" pour cette table.[*]le "actAs", "timestample" , je ne l'ai jamais testé dans cette partie de la relation, a voir si c'est utile, si ça fonctionne.[*]la relation côté "Loan" : permet de créer les deux méthodes sur l'objet Loan pour récupérer LE "User" et LE "Media" unique pour un enregistrement de "Loan".

    Pour ajouter un user avec un média lié tu devrais écrire un truc dans le genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $media = new Media;
    $medi->setTitle('ddd')->
        setAuthor('ddd')->
        setSummary('ddd')->
        save();
     
    $user = new User;
    $user->setName('ddd')->
        setEmail('ddd')->
        setPhone('ddd')->
        setMedias(array($media))->
        save();
    Est-ce bien ce que tu cherchais ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    73
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 73
    Par défaut
    C'est pas loin de ce que je cherche.

    Je ne veux pas créer un nouveau media, je cherche à lier un media existant à une nouveau User.

    En fait, User, Media, Loan, c'était pour l'exemple.

    En réalité j'ai le schéma (en condensé) suivant:

    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
     
    Order:
      actAs: { Timestampable: ~ }
      columns:
        customer_id:       { type: integer, notnull: true}
        secure_key:        { type: string(32), notnull: true }
        payment:           { type: string(64), notnull: true, default: 'free' }
        total_discount:    { type: decimal, notnull: true, default: 0 }
        total_paid:        { type: decimal, notnull: true, default: 0 }
      relations:
        Customer:         { local: customer_id, foreign: id, foreignAlias: Orders, foreignType: Many }
     
    State:
      columns:
        name:             { type: string(64), notnull: true }
        invoice:          { type: boolean, notnull: true, default: 0 }
        send_email:       { type: boolean, notnull: true, default: 0 }
      relations:
        Orders:
          refClass:       Order_history
          class:          Order
          local:          state_id
          foreign:        order_id
          foreignAlias:   States
     
    Order_history:
      actAs: { Timestampable: ~ }
      columns:
        order_id:       { type: integer, notnull: true }
        state_id: { type: integer, notnull: true }
      relations:
        Order:          { local: order_id, foreign: id, foreignAlias: Histories }
        State:    { local: state_id, foreign: id, foreignAlias: Histories }
    J'ai donc des ordres de commandes (liés à des utilisateurs non présentés ici),
    et des statuts de commande (State).
    Les deux tables sont liées par la table Order_history, où on stocke l'historique des actions faites sur les ordres( préparation en cours, puis livraison en cours, etc...)

    Je souhaite donc qu'à la création d'une commande, on associe le statut préparation en cours à la commande (id 3 dans la table State par exemple).

    (L'idée c'est de modifier ensuite ce statut en fonction de l'avancement de la commande, tout en gardant une trace dans l'historique.)

    J'ai donc la classe Order suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
     
    class Order extends BaseOrder
    {
     
    	public function createOrder($customer)
    	{
                            $this->setCustomer($customer)
    			->setSecureKey($customer->getSecureKey())
    			->setStates(3)
    			->save();
    	}
     
    }
    Et ça ne fonctionne pas... => Unknown method Order::setStates
    Je ne comprend pas du tout.

  6. #6
    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
    Dans ton schéma je simplifierais en retirant les lignes ci-dessous

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
      ...
      relations:
        Orders:
          ...
          local:          state_id    <--suppr
          foreign:        order_id   <--suppr
          ...
    Et transformer les lignes suivantes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
      relations:
        Order:          { oreignAlias: Histories }
        State:    { foreignAlias: Histories }
    Cela ne devrait pas changer beaucoup, mais va rendre le schéma plus claire en retirant les options par défauts

    Pour ton code, je ne comprends pas ce que tu veux faire par un setStates(3), il n'y a pas de champ states dans order.

    Note qu'aucune des fonctions setFields('value') n'existent, ce sont des fonctions récupérées par __Call(). Tu as dans le code de OrderBase.class.php, en entête, le nom de toutes les fonctions virtuels que l'objet gère.

  7. #7
    Membre confirmé Avatar de speedy_g
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    213
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Avril 2007
    Messages : 213
    Par défaut
    Je ne sais pas ce qui est implémenté dans la classe User, ptêt que quelqu'un connaissant symphony pourra mieux te répondre que moi.

Discussions similaires

  1. Problème relation formulaire/table
    Par moilou2 dans le forum IHM
    Réponses: 5
    Dernier message: 28/02/2008, 14h49
  2. [phpMyAdmin] Problème relation entre tables
    Par momo0409 dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 6
    Dernier message: 14/09/2007, 15h04
  3. Problème relation entre champs
    Par Zinemon dans le forum IHM
    Réponses: 1
    Dernier message: 14/06/2007, 14h55
  4. Réponses: 7
    Dernier message: 21/01/2007, 12h12
  5. Réponses: 4
    Dernier message: 14/09/2005, 16h29

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