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 :

Query builder : passer $id en paramètre [2.x]


Sujet :

Symfony PHP

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut Query builder : passer $id en paramètre
    Bonjour,

    J'essaie d'utiliser le query builder dans ma classe formulaire.
    J'ai déjà crée ma fonction dans mon repository.

    voici mon form:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php 
     
    ->add('candidatecampaign', 'entity', 
    	array (
    	'label' => 'NomDuLabel',
    	'class' => 'Adl\\HiringBundle\\Entity\\CandidateCampaign',
    	'property' => 'name',
    	'query_builder' => function(CandidateCampaignRepository $er) 
    			{
    			return $er->getCandidateCampaignList($id);
    			},
    	'required' => true))
    $id est le paramètre qui doit correspondre à l'id passé à ma méthode <gras>editAction($id)</gras>.

    Voici ma fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php 
     
    	public function getCandidateCampaignList ($id)
    	{
     
    		$qb = $this->createQueryBuilder('a');
     
    		$qb->where('a.candidate = :candidate')
    			  ->setParameter('candidate', $id);
     
    		return $qb->getQuery()->getResult();
    	}


    Je ne vois pas comment lui passer l'argument id courant. J'ai donc cette erreur :

    Notice: Undefined variable: id in E:\Web\WampSites\Symfony\src\Adl\HiringBundle\Form\InterviewType.php line 62
    Dois-je passer l'id via le constructeur du formulaire ? Est-ce possible de faire firectement un candidate->getId() dans le query builder ? Je sais pas trop comment m'y prendre là ?

  2. #2
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Tu n'es pas très loin, essaye le use :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    'query_builder' => function(CandidateCampaignRepository $er) use ($id)
        {
            return $er->getCandidateCampaignList($id);
        },

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    salut,

    Ouais je me dis aussi que je suis pas loin mais bon...

    Je viens d'essayer comme tu as dit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     <?php ->add('candidatecampaign', 'entity', 
    	array (
    			'label' => 'NomDuLabel',
    			'class' => 'Adl\\HiringBundle\\Entity\\CandidateCampaign',
    			'property' => 'name',
    			'query_builder' => function(CandidateCampaignRepository $er) use ($id) 
    			{
    					return $er->getCandidateCampaignList($id);
    			},
    					))
    mais j'ai toujours la même erreur deux lignes plus haut cette fois.

    Je ne parviens pas à passer ce paramètre. Ma classe form semble ne pas le voir. Comment dois-je le passer.

  4. #4
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Ah oui effectivement si tu ne l'as déjà pas dans ta classe, ca va être difficile
    Je te conseille de le passer dans le contructeur de ton Form, et de l'envoyer lors de sa création dans ton controller. De ce genre là :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        public function __construct($id)
        {
            $this->id = $id;
        }
    Ensuite tu remplaces juste ton $id par $this->id pour le querybuilder.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    Dans mon controleur, je fais ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <?php $interview_form = $this->createForm(new InterviewType($id), $interview);
    Dans ma classe de formulaire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    <?php public function __construct($id)
        {
            $this->id = $id;
        }
     
    'query_builder' => function(CandidateCampaignRepository $er) use ($this->id) 
    	{
    			return $er->getCandidateCampaignList($this->id);
    	},
    Je reçois une merveilleuse erreur :

    Fatal error: Cannot use $this as lexical variable in E:\Web\WampSites\Symfony\src\Adl\HiringBundle\Form\InterviewType.php on line 65
    Jamais eu cette erreur, comment dois-je l'interpréter ?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Un dernier petit effort :

    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
    <?php public function __construct($id)
        {
            $this->id = $id;
        }
     
    public function buildForm()
    {
    $id = $this->id;
     ....
    'query_builder' => function(CandidateCampaignRepository $er) use ($id) 
    	{
    			return $er->getCandidateCampaignList($id);
    	},
     
    ...
    }

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    Désolé mais ça ne fonctionne toujours pas.

    J'ai pourtant essayé avec ton code et mis ceci dans mon controleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $interview_form = $this->createForm(new InterviewType($id), $interview);
    Voici la nouvelle erreur :


    Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Ligne de l'erreur, code complet de ton Type STP

    Parce que là l'erreur n'est pas forcément dans ce que tu nous montres...

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    Pas de n° de ligne. Simplement :

    Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given
    Le voici (désolé c'est un peu long) :

    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
    <?php
     
    namespace Adl\HiringBundle\Form;
     
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilder;
    use Symfony\Bridge\Doctrine\Form\Type\EntityType;
    use Adl\HiringBundle\Entity\CandidateCampaignRepository;
     
    class InterviewType extends AbstractType
    {
     
    	public function __construct($id)
        {
            $this->id = $id;
        }
     
        public function buildForm(FormBuilder $builder, array $options)
        {
    	$id = $this->id;
     
            $builder
     
    			->add('date', 'date', array (
    												'widget' => 'choice',
    												'pattern' => '{{ day }}-{{ month }}-{{ year }',
    												))
    			->add('startingTime', 'time')
    			->add('endingTime','time')
    			->add('round','choice',array(
    												'choices'=>array(
    																			'Round_0'=>'Round 0',
    																			'Round_1'=>'Round 1',
    																			'Round_2'=>'Round 2',
    																			'Round_2bis'=>'Round 2 - bis',
    																			'Round_3'=>'Round 3',
    																			'Round_final'=>'Final Round',
    																			)))
    			->add('offerStatus','choice',array(
    												'choices'=>array(
    																			'none'=>'None',
    																			'accepted'=>'Accepted',
    																			'pending'=>'Pending',
    																			'declined'=>'Declined')))
     
    			->add('status','choice',array(
    												'choices'=>array(
    																			'none'=>'None',
    																			'done'=>'Done',
    																			'no_show'=>'No Show')))
    			->add('offerMade','choice',array(
    												'choices'=>array(
    																			'no'=>'No',
    																			'yes'=>'Yes')))
    			->add('interviewer', 'entity', array (
    																'label' => 'NomDuLabel',
    																'class' => 'Adl\\HiringBundle\\Entity\\Interviewer',
    																'property' => 'firstname',
    																'required' => true))
    			->add('comment','textarea',array(
    												'required'=>false))
     
    			->add('candidatecampaign', 'entity', 
    										array (
    												'label' => 'NomDuLabel',
    												'class' => 'Adl\\HiringBundle\\Entity\\CandidateCampaign',
    												'property' => 'name',
    												'query_builder' => function(CandidateCampaignRepository $er) use ($id) 
    												{
    												return $er->getCandidateCampaignList($id);
    												}
    									))
     
    			->add('_token','hidden')
     
            ;
        }
     
        public function getName()
        {
            return 'adl_hiringbundle_interview';
        }
     
    	public function getDefaultOptions(array $options)
        {
            return array(
                'data_class' => 'Adl\HiringBundle\Entity\Interview',
    			'csrf_protection' => true,
                'csrf_field_name' => '_token',
                'intention' => 'interview_item',    // a unique key to help generate the secret token
            );
        }
     
    }

  10. #10
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    C'est ta fonction getCandidateCampaignList dans ton repository, il faut que tu retournes le QueryBuilder, et non les résultats.

  11. #11
    Membre émérite

    Profil pro
    Inscrit en
    Juin 2004
    Messages
    772
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Juin 2004
    Messages : 772
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'query_builder' => function(CandidateCampaignRepository $er) use ($id) 
        {
            return $er->createQueryBuilder('entity')
                           ->where('entity.tonChampDeFiltrage = ' . $id);
                     }
        }

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    Je check

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    Mais dans ce cas, je ne peux pas utiliser ma méthode crée dans mon repository.
    Ce que je veux c'est utiliser la méthode que j'ai crée et simplement y faire appel. N'est-ce pas possible ? Car pour que le code reste propre, je réfère stocker mes méthodes dans mon repository.

  14. #14
    Membre expérimenté
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2004
    Messages
    318
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Avril 2004
    Messages : 318
    Par défaut
    Expected argument of type "Doctrine\ORM\QueryBuilder", "array" given
    C'est rare quand les messages d'erreurs sont aussi clairs.
    Citation Envoyé par Guybrush113 Voir le message
    C'est ta fonction getCandidateCampaignList dans ton repository, il faut que tu retournes le QueryBuilder, et non les résultats.
    T'as une option querybuilder pour un champ de formulaire, il est normal de lui envoyer un querybuilder, et non un tableau.

  15. #15
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    97
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 97
    Par défaut
    Sujet résolu :

    Voici ce qu'il fallait simplement faire dans le repository :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	public function getCandidateCampaignList ($id)
    	{
     
    		$qb = $this->createQueryBuilder('a');
     
    		$qb->where('a.candidate = :id')
    			  ->setParameter('id', $id);
     
    		return $qb;
    	}
    Merci de m'avoir mis sur la piste

  16. #16
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2009
    Messages
    383
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2009
    Messages : 383
    Par défaut
    Autant mettre un array dans choices
    Tu peux le proposer en paramètre du __construct de ton formulaire pour le passer au champ.

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 23/04/2009, 16h13
  2. Réponses: 2
    Dernier message: 04/06/2007, 16h38
  3. SQL Builder et les requêtes paramétrés
    Par laklak dans le forum Bases de données
    Réponses: 9
    Dernier message: 16/05/2007, 14h25
  4. Comment configurer active query builder
    Par davos56 dans le forum Bases de données
    Réponses: 4
    Dernier message: 21/04/2007, 07h38
  5. Réponses: 2
    Dernier message: 05/04/2007, 13h55

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