Doctrine dans les fixtures

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

Je viens vers vous car je rencontre un léger problème lors de la génération de mes fixtures..

En effet, j'ai une entité Event dans laquelle j'ai une relation ManyToOne avec une entité City (comprenez ici qu'un évènement est associé à une ville).

J'ai déjà toutes les villes de France en base, je me dis donc que pour chaque évènement, je vais aller chercher une ville aléatoirement en base pour lui associer, logique jusque là. Voici le code, ça sera plus parlant.

 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
<?php 
public function load(ObjectManager $manager)
    {
        $faker = Factory::create('fr_FR');

        for($i=1; $i<=$this->nbEvent; $i++) {
            $city = $manager->getRepository('MonBundle:City')->find(rand(1, 36568));
            var_dump($city); die;

            $event = new Event();
            $event
                ->setTitle($faker->unique()->catchPhrase)
                ->setDescription($faker->text)
                ->setAddress($faker->streetAddress)
                ->setLatitude($city->getLatitude())
                ->setLongitude($city->getLongitude())
                ->setCity($city)
                ->setCreatedAt($faker->dateTimeThisMonth())
                ->setCategory($this->getReference('category_'.rand(0, (count($this->categories)-1))))
                ->setStartDate($faker->dateTimeThisYear('-2 days'))
                ->setEndDate($faker->dateTimeBetween('-2 days', '+20 days'))
                ->setPremium($faker->boolean())
                ->setImage($faker->imageUrl(75, 75, 'people') . '?' . time())
            ;

            $manager->persist($event);
        }
        $manager->flush();
    }

Mais le problème est que $city vaut toujours NULL… Alors que dans une de mes contrôleurs je fais exactement la même chose :

1
2
3
4
5
<?php
$manager = $this->getDoctrine()->getManager();

$city = $manager->getRepository('MonBundle:City')->find(rand(1, 36568));
var_dump($city); die;

Et là j'ai bien une ville au hazard…

Avez-vous une idée sur le problème ?

Version de SF : 2.5

Édité par JacobDelcroix

+0 -0

Salut !

A tout hasard, est-ce que tu as plusieurs managers, et ce ne serait pas le bon qui serait passé à load() ?

Autre piste : est-ce que le manader est bon, le repository retourné en ligne 7 l'est aussi, mais find() ne trouve rien ?

Édité par Ymox

Evitez qu'on vous dise de les lire : FAQ PHP et Symfony 2Tutoriel WAMP • Cliquez 👍 pour dire merci • Marquez vos sujets résolus

+0 -0

Salut,
Autre piste (simpliste, mais on ne sait jamais) : est-ce que tu es sûr que tes fixtures se chargent dans le bon ordre, autrement dit que les villes sont chargées avant les événements (getOrder(), tout ça) ?

Lors d'un fixtures:load, les données de la BDD sont supprimées (sauf si tu fais un --append), donc ça peut jouer.

+1 -0

Autre chose : Faire ce que tu fais (dépendre de ton répo pour choper d'autres objets), en plus d'être aléatoire, n'est absolument pas stable. Dans des fixtures, il faut que t'ignores le contenu de ta bdd, comme te l'indique mon VDD. Et pour selectionner en random… Il y a bien mieux aussi (faire une requêtre propre dans un repo par exemple)

Bosse donc avec des références. ;)

Édité par Talus

"Meh." Outil de diff PHP : Totem

+0 -0
Auteur du sujet

Autre chose : Faire ce que tu fais (dépendre de ton répo pour choper d'autres objets), en plus d'être aléatoire, n'est absolument pas stable. Dans des fixtures, il faut que t'ignores le contenu de ta bdd, comme te l'indique mon VDD. Et pour selectionner en random… Il y a bien mieux aussi (faire une requêtre propre dans un repo par exemple)

Bosse donc avec des références. ;)

Talus

Faire une requête perso juste pour un RAND(), je trouve ça bof. Le ORDER BY RAND() est vraiment pas terrible niveau performance (et j'ai un jeu de données assez conséquent). Sinon je ne veux pas non plus ignorer mon contenu de la BDD vu que la table des villes je la rempli dans une fixtures juste avant (donc je sais qu'elle est viable)… Et je veux absolument dans mes fixtures TOUTES les villes de France (36k environ) donc je me vois mal passer par référence 36k objet juste pour faire un rand en PHP :-). Le plus simple aurait été en effet, d'ajouter quelques villes, de les passer par référence et ensuite d'en piocher une au hazard pour chacun de mes évènements. Mais comme la plupart de mes requêtes sur le site sont à base de calcul de distance/géolocalisation je n'aurait pas pu mesurer l'impact sur les performances (faire une calcul de distance des villes avec 100 villes en base ou 36k c'est pas la même chose niveau perf').

Sinon mon problème est résolu merci, le truc était tout con mais ça m'a permit d'améliorer un peu mes fixtures. En gros, le fixtures:load ne TRUNCATE pas les tables par défaut, il DELETE les lignes. Donc les IDs des villes augmentaient à chaque lancement (normal) et donc forcément mon find(rand()) n'était plus bon donc du coup je me base sur un autre champ de mon entité pour faire ma requête. Truc tout con que je savais mais ça m'a pas sauté aux yeux directement (oui, oui c'est ça quand on code toute la journée :p)

Merci à tous pour vos pistes.

Édité par JacobDelcroix

+0 -0

Sauf que des fixtures ne servent pas réellement à ca (peut-être en one shot, et encore…). Puisque ton machin a l'air de se baser plus sur des données réelles (à insérer en bdd), vaut mieux passer par l'extension de migrations de Doctrine. :)

Concernant le RAND, oui et non… Car bon, même si tu as en effet 36k villes, rien ne te dit que les id seront continues, etc. Donc faire un rand tel que tu le fais, c'est pas ce qu'il y a de mieux :)

Édité par Talus

"Meh." Outil de diff PHP : Totem

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

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