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 :

[Symfony2] - Multiple orderby dans un Criteria


Sujet :

Symfony PHP

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut [Symfony2] - Multiple orderby dans un Criteria
    Bonjour,

    J'utilise en ce moment le Criteria pour filtrer une collection d'objets. Mais lorsque je souhaite réaliser un orderBy avec 2 champ, seul le premier est pris en compte. Je ne comprends pas.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    $events = new Collections\ArrayCollection($results);
    $dateFrom = new \DateTime($date);
    $dateTo   = new \DateTime(date('Y-m-d H:i:s', strtotime($date . ' + 1 day')));
     
    $criteria = Criteria::create()
    	->where(Criteria::expr()->eq('activity', $activity));
     
    $criteria->orderBy(array(
    	"time" => "ASC",
    	"title" => "ASC"
     
    ));
    Je remercie d'avance pour d'éventuelles réponses .

  2. #2
    Membre averti

    Inscrit en
    Juin 2008
    Messages
    307
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 307
    Points : 364
    Points
    364
    Par défaut
    Et si tu fais ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $criteria->orderBy(array("time" => "ASC"))
    ->addOrderBy(array("title" => "ASC"));
    est ce que ca marche mieux

    je trouve pas dans la doc de doctrine2 http://docs.doctrine-project.org/en/...l#expr-classes la notation que tu as utilisé.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    La documentation que j'ai utilisé est celle ci : http://doctrine-orm.readthedocs.org/...ng-collections

    Malheuresement avec un addOrderBy, cela ne marche toujours pas.

  4. #4
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Est-ce qu'on peut savoir ce que ça veut dire "ça ne marche pas" ? Quel est le résultat attendu, quel est le résultat rendu ?

    Donne nous un exemple avec des données.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    En fait je souhaite que la collection soit trier par "time", puis ensuite par "title" mais en ce moment, il n'y a que "time" qui est pris en compte.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Inscrit en
    Juin 2011
    Messages
    725
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juin 2011
    Messages : 725
    Points : 1 050
    Points
    1 050
    Par défaut
    Bonjour,


    Ou se trouve ton code ?
    1 / dans un repository
    -> dans ce cas utilise plutôt le query builder

    2 / dans une méthode de ton entité

    -> Y a t'il déjà une annotation orderBy sur ton association qui pourrait interférer ? (si oui essaie de l'enlever)
    -> dans ton test, le tri se fait t'il
    -> au niveau SQL (dans ce cas tu devrais voir la requete généré dans le profiler symfony)
    -> au niveau php ? (Si la collection a déjà été chargé)

    (je viens de tester cette fonctionnalité de Doctrine que je ne connaissais pas, et j'ai bien mes 2 orderBy dans la requete SQL (SF 2.3 / Doctrine 2.2 )

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    Mon code se situe dans un controller.

    Tu trouveras la fonction du controller ci-dessous :

    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
     
    public function resultsAction($page)
    {
    	$session 	 = $this->getRequest()->getSession();
    	$request 	 = $this->container->get('request');
    	$searchEvent = $session->get('searchEvent');
     
    	if ($request->getMethod() == 'POST'){
    		$parameters = array_keys($request->request->all());
    		$nameForm = $parameters[0];
     
    		if ($nameForm == 'jesors_eventbundle_eventsearchindex'){
    			$form = $this->container->get('form.factory')->createBuilder(new EventSearchIndexType())->getForm();
    		} elseif($nameForm == 'jesors_eventbundle_eventsearch') {
    			$form = $this->container->get('form.factory')->createBuilder(new EventSearchType())->getForm();
    		}
     
    		$formHandler = new EventHandler($form, $request, $this->getDoctrine()->getManager());
     
    		if ($formHandler->process()) {
    			$location  = $form['location']->getData();
    			$latitude  = $form['latitude']->getData();
    			$longitude = $form['longitude']->getData();
    			$activity  = $form['activity']->getData();
    			$date      = $form['date']->getData();
    			$distance  = $form['distance']->getData();
     
    			$filter = new GeoDistance('lat_long', array('lat' => $latitude,'lon' => $longitude), $distance);
    			$filtered = new Filtered(new MatchAll(), $filter);
    			$results = $this->container->get('fos_elastica.finder.website.event')->find($filtered, 15000);
     
    			$events = new Collections\ArrayCollection($results);
    			$dateFrom = new \DateTime($date);
    			$dateTo   = new \DateTime(date('Y-m-d H:i:s', strtotime($date . ' + 1 day')));
     
    			$criteria = Criteria::create()
    				->where(Criteria::expr()->eq('activity', $activity));
     
    			if (!is_null($date)){
    				$criteria->andWhere(Criteria::expr()->gte('date', $dateFrom))
    						 ->andWhere(Criteria::expr()->lt('date', $dateTo));
    			} else {
    				$criteria->andWhere(Criteria::expr()->gte('date', new \DateTime(date('Y-m-d H:i:s'))));
    			}
     
    			$criteria->orderBy(array(
    				"date" => "ASC",
    				"time" => "ASC"
    			));
     
    			$session->set('searchEvent', $events->matching($criteria));
    			$session->set('searchLocation', $location);
    			$session->set('searchDistance', $distance);
     
    			$paginator  = $this->get('knp_paginator');
    			$pagination = $paginator->paginate(
    				$events->matching($criteria),
    				$this->get('request')->query->get('page', 1),
    				15
    			);
    		}
    	} else {
    		$paginator  = $this->get('knp_paginator');
    		$pagination = $paginator->paginate(
    			$searchEvent,
    			$this->get('request')->query->get('page', $page),
    			15
    		);
    	}
     
    	return $this->render('JesorsEventBundle:Event:list.html.twig', array(
    		'pagination'     => $pagination
    	));
    }

  8. #8
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Je réitère la deuxième partie de ma réponse :

    Donne nous un exemple avec des données.
    Si tu fais un tri par time (à la seconde près) il est fort probable que tu n'aies pas deux valeurs avec le même 'time' exactement.
    Le deuxième tri, sur ton autre paramètre, ne s'applique que si tu as des valeurs strictement identiques dans le premier cas.
    Dans un cas à la seconde près, l'ordre à la seconde aura lieu, et à moins que tu aies plusieurs valeurs avec un time égal, il n'y aura pas besoin de faire un deuxième tri.

    Avant d'accuser un problème avec le code, assure toi que la réflexion est bonne

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Points : 7
    Points
    7
    Par défaut
    En fait là ça me sort comme valeurs :

    Entité 1:
    Heure : 15:35
    Date:05/09/2014

    Entité 2:
    Heure : 13:30
    Date:05/09/2014

    Entité 3:
    Heure : 19:45
    Date:05/09/2014

    La date est bonne, mais l'heure n'est pas ordonnée.

  10. #10
    Membre expérimenté Avatar de Nico_F
    Homme Profil pro
    Développeur Web
    Inscrit en
    Avril 2011
    Messages
    728
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Avril 2011
    Messages : 728
    Points : 1 310
    Points
    1 310
    Par défaut
    Il n'y a rien d'ordonné là : l'heure n'est pas ordonnée et les dates sont toutes les mêmes.

    Utilise au moins des données significatives quand tu veux faites des tests.

    Autrement, un Datetime n'aurait-il pas été plus pratique ?

Discussions similaires

  1. Multiples slashes dans FIndFirstFile
    Par kunda dans le forum Windows
    Réponses: 3
    Dernier message: 13/11/2007, 00h25
  2. [PHP-JS] Copier des multiples champs dans d'autres
    Par Akim13 dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 13/07/2007, 16h26
  3. Choix multiple à afficher dans une autre fenêtre
    Par makohsarah dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 11/07/2007, 11h37
  4. Multiple requête dans 1 seul TQUERY
    Par AODRENN dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/06/2007, 10h41
  5. [MySQL] select multiple à reporter dans une requête
    Par PatBateman dans le forum PHP & Base de données
    Réponses: 10
    Dernier message: 07/03/2007, 14h05

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