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 :

Message spl_object_hash() expects parameter 1 to be object, string given


Sujet :

Symfony PHP

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut Message spl_object_hash() expects parameter 1 to be object, string given
    Bonjour à tous,

    J'ai une entité "livre" qui contient un champ "langue", plus d'autres champs.
    Pour ne pas mettre des km de code, je ne laisse que celui qui me semble important.
    Je veux faire un formulaire de création, avec une liste déroulante qui contient toutes les langues, mais une seule fois chacune, d'où le distinct dans mon query builder, car je vais chercher les langues dans mon entité "livre", pour récupérer celles qui existent déjà.

    A la ligne de mon controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'form_livre' => $form_livre->createView(),
    J'ai le message :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: spl_object_hash() expects parameter 1 to be object, string given
    Google étant mon ami, j'ai passé des heures de recherches, essayé plein de trucs tordus, sans succès.
    Mon champ "langue" est défini en chaine, comment je peux retourner un objet ?

    Donc là, j'ai simplifié au maximum mon code, et j'espère vore aide !

    entité "livre" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    /**
     * @var string
     *
     * @ORM\Column(name="langue", type="string", length=200)
     */
    private $langue;
    controller :
    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
    $livre = new Livre();
    $form_livre_builder = $this->get('form.factory')->createBuilder(livreType::class, $livre);
    $form_livre_builder->add('langue', EntityType::class, array(
        'label'        => 'livre.formcreer.langue', 
        'placeholder'  => 'français',
        'class'        => 'testBundle:Livre',
        'choice_label' => 'langue',
        'multiple'     => false,
        'expanded'     => false,
        'query_builder' => function (EntityRepository $er) {
            return $er->createQueryBuilder('l')
                ->select('l.langue')
                ->distinct()
                ;
            },
        ))
    ;
    $form_livre = $form_livre_builder->getForm();
     
    return $this->render('testBundle:Visit:visit_livre_creer.html.twig', array(
        'form_livre' => $form_livre->createView()
    ));
    Merci d'avance pour votre aide !

  2. #2
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Bon, j’avance un peu…

    Avec le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    'query_builder' => function (EntityRepository $er) {
                        return $er->createQueryBuilder('l')
                            ->select('l')
                            ;
                        },
    Je n’ai pas d’erreur, puisque je retourne bien mon objet 'livre', mais ça affiche dans ma liste déroulante toutes mes valeurs en table, sans supprimer les doublons par rapport au champ 'langue'.

    Après le ‘select’, j’ai essayé en ajoutant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    -> distinct('l.langue')
    Ça ne change rien.

    Ou en ajoutant :
    J’ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.l0_.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    Ayant généré mes tables MySql à partir de mes entités, j’imagine que les options sont correctes, et je préfère ne pas changer le sql_mode.

    Comment n’avoir que les valeurs distinctes dans ma liste déroulante ?

    Merci d’avance.

  3. #3
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    Citation Envoyé par merou19 Voir le message
    Bon, j’avance un peu…

    J’ai une erreur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'test.l0_.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by
    Ayant généré mes tables MySql à partir de mes entités, j’imagine que les options sont correctes, et je préfère ne pas changer le sql_mode.

    Comment n’avoir que les valeurs distinctes dans ma liste déroulante ?

    Merci d’avance.
    tu peux ajouter une fonction d'agrétion comme count():
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    'query_builder' => function (EntityRepository $er) {
                        return $er->createQueryBuilder('l')
                            ->select('count(l.langue) , l.langue')
                            ->groupBy('l.langue')
                            ;
                        },

  4. #4
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Merci beaucoup pour ta proposition !!!

    Je viens d'essayer, et je retombe sur mon message d'erreur du début :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Warning: spl_object_hash() expects parameter 1 to be object, string given
    En effet, mon select ne ramène plus un objet 'livre', mais les 2 champs : le count et la langue.

    Tout idée est la bienvenue !
    Merci d'avance.

  5. #5
    Membre éprouvé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    631
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2012
    Messages : 631
    Points : 1 220
    Points
    1 220
    Par défaut
    Pour alimenter la liste déroulante, tu as 2 choix. Soit tu stockes les langues dans un tableau associatif dont la valeur correspond à l’attribut VALUE de l'élément SELECT du formulaire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    use Symfony\Component\Form\Extension\Core\Type\ChoiceType;
    // ce tableau peut être placé dans l'entité de livre, dans un Trait par exemple
    $langues = array(
        'choices'  => array(
            'Français' => 'fr',
            'Anglais' => 'en',
            'Allemand' => 'de',
        ),
    $builder->add('langue', ChoiceType::class, $langues,
    ));
    Soit tu crées une entité Langue qui aura une collection de livres(oneToMany du côté de Langue et ManyToOne du côté de livre), ce qui correspond à la construction de ton formulaire avec une queryBuilder ou une EntityType.

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    156
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 156
    Points : 136
    Points
    136
    Par défaut
    Yes, merci pour tes indications !
    J'ai fait un petit select distinct pour récupérer mes langues, puis je les mets dans un tableau associatif, que j'utilise dans le add de mon champ, et ça marche nickel !
    Initialement, je trouvais ça plus fun de mettre le distinct dans le querybuilder, mais vu que ça ne marche pas, ta méthode est très efficace.
    Enfin, si quelqu'un trouve un jour un moyen avec le querybuilder, pour ma culture informatique, je suis preneur...
    Merci encore à toi !

Discussions similaires

  1. [2.x] Warning: spl_object_hash() expects parameter 1
    Par syrine01 dans le forum Symfony
    Réponses: 4
    Dernier message: 10/08/2016, 00h38
  2. Réponses: 3
    Dernier message: 16/03/2016, 21h50
  3. Réponses: 5
    Dernier message: 14/12/2011, 07h38
  4. Réponses: 4
    Dernier message: 12/04/2010, 22h14

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