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

Doctrine2 PHP Discussion :

Impossible de persist + flush plus de 1000 lignes


Sujet :

Doctrine2 PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Par défaut Impossible de persist + flush plus de 1000 lignes
    Bonjour,

    J'ai un souci sur une table dans ma bdd, ou plutôt lorsque je persist et que je flush :
    ma table ne va pas plus loin que 1001 lignes (le champ ID) lorsque j'utilise doctrine pour en modifier les données, alors que via phpmyadmin, je peux ajouter d'autres entrées et largement dépasser les 1000 lignes.. Je suppose donc que cela ne vient pas de ma config mysql (mon champ ID est un int(15) unsigned, donc capable de dépasser les 1000 lignes), mais bien de doctrine ou symfony qui limite la taille du json, je ne sais pas.. Lorsque j'ajoute d'autres lignes à la main via phpmyadmin, les modifs s'affichent bien sur mon application : l'application semble capable de récupérer plus de 1000 lignes et de les afficher, mais pas d'envoyer une telle unité à la bdd (dès que j'enregistre, les lignes supplémentaires disparaissent).

    Voici le code lorsque je persist et flush :
    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
    public function clearData()
    	{
    		$connection = $this->_em->getConnection();
    		$platform   = $connection->getDatabasePlatform();
     
    		$connection->executeUpdate($platform->getTruncateTableSQL('laisonLink', false));
    	}
     
    	public function addLinks($data)
    	{
    		foreach($data as $link) {
    			// Création du lien
    			$lien = new LaisonLink();	// On crée le lien
    			$lien->setLinkParent($link['parent']);
    			$lien->setLinkEnfant($link['enfant']);
    			$lien->setTime(new \DateTime());
     
    			$this->_em->persist($lien);				// On le persiste
     
    		}
    	$this->_em->flush();	
    	}
    Et voici le code de mon controller pour cette action :
    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
     public function linkLinksAction() 
        {	// Page permettant de relier les liens entre eux
     
        	$request = $this->get('request');
        	$formsRepository = $this->getDoctrine()->getEntityManager()->getRepository('appGlobalBundle:Link');
        	$linksRepository = $this->getDoctrine()->getEntityManager()->getRepository('appGlobalBundle:LaisonLink');
     
        	$links = $formsRepository->getVisible();
        	$linksBis = $linkssRepository->getVisible();
        	$existantes = $linksRepository->getData();
     
        	if( $request->getMethod() == 'POST' ) {
        		// On a reçu les nouvelles informations de liaison des liens, on les enregistre dans la base
     
        		$toRemove = array();
        		$toAdd = array();
     
        		$linksRepository->clearData();
     
        		foreach($links as $parent) {
        			foreach($linksBis as $enfant) {
     
    					if ($request->request->get('lien'.$parent->getId().'_'.$enfant->getId()) == 'on') {
        					// On ajoute un enregistrement
        					$toAdd[] = array('parent' => $parent, 'enfant' => $enfant);
        				}
        			}
        		}
     
        		$linksRepository->addLinks($toAdd);
     
        		return new Response(json_encode(array('text' => 'Les liaisons ont bien été mises à jour.', 'layout' => 'bottomLeft', 'type' => 'success')));
        	} else {
        		// On affiche le tableau de liaison, prérempli avec les informations existantes
        		return $this->render('appliGlobalBundle:Admin:linksLinks.html.twig', array('forms' => $links, 'lnBis' => $linksBis, 'liens' => $existantes));
        	}
     
     
        }
    Merci pour votre aide

  2. #2
    Membre expérimenté

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Par défaut
    tu as un message d'erreur ?

  3. #3
    Membre du Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Par défaut
    Aucun, j'ai même le message de success, puisqu'en soi côté app il n'y a pas de problème : lorsque j'essaye d'enregistrer plus de 1000 lignes, seules les 1000 premières passent, les autres non.

    EDIT : En entrant des données à la main (je suis allez jusqu'à l'id 1350), l'app affiche bien tout..

  4. #4
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    je suis un peu en retard, mais je pense que tu essaye d'en insérer trop d'un coup.
    Tu peux aisément faire un test avec un flush toutes les 50 insertions par exemple.


    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
     
    public function addLinks($data)
    {
    $i = 1;
    		foreach($data as $link) {
    			// Création du lien
    			$lien = new LaisonLink();	// On crée le lien
    			$lien->setLinkParent($link['parent']);
    			$lien->setLinkEnfant($link['enfant']);
    			$lien->setTime(new \DateTime());
     
    			$this->_em->persist($lien);				// On le persiste
    if($i%50==0){
        $this->_em->flush();	
    }
     
    		}
    	$this->_em->flush();	
    }
    Ca devrait t'emener plus loin.
    Après, tu ne teste pas du tout si le lien existe avant de le créer... tu n'a pas de contraintes pour limiter le couple parent / enfant a un seul element ? un même parent peut il etre lié 2 fois avec le même enfant ?

    Pierre

  5. #5
    Membre du Club
    Homme Profil pro
    Ingénieur sécurité
    Inscrit en
    Septembre 2013
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2013
    Messages : 8
    Par défaut
    Merci Pierre pour ta réponse.

    Aucun souci pour le retard, le problème n'est toujours pas réglé

    Un même parent ne peut pas être lié deux fois avec un même enfant, non.
    Ma page d'administration ou je gère ça est un tableau avec des cases à cocher, du type :
    Lien 1 Lien 2 Lien 3 Lien 4
    Lien 1 non
    Lien 2 x non
    Lien 3 x non
    Lien 4 x non

    Dans cet exemple, les "non" sont des cases impossibles à cocher, les "x" sont les cases cochées, le reste est non coché !

    Je vais essayer ton code, je n'y avait pas penser du tout.

    Encore merci

  6. #6
    Membre Expert
    Avatar de pmithrandir
    Homme Profil pro
    Responsable d'équipe développement
    Inscrit en
    Mai 2004
    Messages
    2 419
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Responsable d'équipe développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 419
    Par défaut
    La doc : http://doctrine-orm.readthedocs.org/...rocessing.html

    Pour moi tu devrais faire 1 test : vérifier que ton tableau de contient pas de doublons.
    Ca peut se faire aussi par un truc tout bete, crééer un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $tab[$idParent][$idEnfant]= new Array("parent"=>$idParent, "enfant"=>$idEnfant);
    Attention, est-ce que id1->id2 est équivalent a id2->id1
    Peux tu avoir dans ta base ce genre de choses, si c'est le cas il faut tester encore plus. Et même si tu pense maitriser ton système, ta validation d'unicité est faite coté HTML aujourd'hui(ton formulaire te permet uniquement certaines choses) Que se passe t'il si quelqu'un édite le formulaire pour mettre des valeurs fantaisistes en changeant les id manuellement dans les checkbox par exemple.

    Pierre

Discussions similaires

  1. Persister une entité et flush "plus tard"
    Par solofein dans le forum Doctrine2
    Réponses: 5
    Dernier message: 30/09/2014, 01h45
  2. PEUT ON IMPORTER FICHIER EXCEL PLUS DE 1000 LIGNE?
    Par omarnigth dans le forum Deski
    Réponses: 0
    Dernier message: 04/08/2012, 05h49
  3. Import fichier Excel de plus de 1000 lignes
    Par christelle_s dans le forum Deski
    Réponses: 2
    Dernier message: 10/06/2011, 14h34
  4. Réponses: 3
    Dernier message: 19/05/2006, 20h38
  5. Réponses: 5
    Dernier message: 03/11/2005, 16h54

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