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 :

Projet Youtube-like ORM : avis sur la structure et sur les requètes


Sujet :

Doctrine2 PHP

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Projet Youtube-like ORM : avis sur la structure et sur les requètes
    Je suis débutant en Symfony2 j'ai commencé il y a un mois.
    J'ai pour projet de réaliser un site type Youtube pour l'association de vidéo de mon école.
    J'ai déjà bien avancé mais j'aimerai un coup de main pour Doctrine.

    Je vais tout d'abord vous expliquer le projet.
    L'association effectue des projections de vidéo (type mini sketchs et événements ).
    Nous avons déjà un vieux site permettant aux élève de visionner un projection. Ce site c'est qu'une simple arborescence chronologique avec un player.
    Nous souhaitons passer au stade supérieur.

    C'est a dire, la possibilité d'effectuer des recherche par tag,année et soirée. Bien sure nous garderons l’arborescence chronologique ie années -> projections -> videos mais nous rajouterons la possibilité de lancer l'ensemble d'une projection ou d'une année ou juste d'une vidéo. Et pour finir que chaque utilisateur puisse se créer sa propre playlist de favoris.

    vous pouvez consultez mes class ICI

    et mon controller actuel ICI

    Vous poirez remarquer que j'ai fait toutes les requêtes en SQL avant doctrine car cela m'aide à voir ce qu'il faut que je fasse ^^.

    par exmeple comment puis je récupérer les videos les plus vues ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $mostview = $this->getDoctrine()
                        ->getRepository('IienBundle:Video')
                        ->findBy(array(), array('vues'=>'DESC'))
                        ->setMaxResult(10);
    sauf qu'il me repond Could not convert database value "" to Doctrine Type object

    a mon avis c'est que mes objet video sont vide pour le moment comment puis je faire ?

    Si vous pouviez m'aider et même donner votre avis sur la structure de mon ORM ça sera super cool :p

    Merci de votre aide.

  2. #2
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    En gros mon problème pour l'instant c'est de transformer ces requètes sql en requètes doctrine sauf que rien ne marche :/

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT * FROM Video WHERE soiree = (SELECT MAX(soiree) FROM video)
    SELECT titre , video FROM Video JOIN (SELECT * FROM favori WHERE Iien = $iduser)
    SELECT label , nom FROM annee JOIN proj ON annee = proj.annee
    SELECT titre , video FROM video ORDER BY vues LIMIT 0,5
    SELECT titre , video FROM Video JOIN (SELECT * FROM favori GROUP BY video ORDER BY COUNT(video) DESC LIMIT 5) AS favoritraite ON video = favoritraite.video

    Merci

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Septembre 2009
    Messages
    875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Septembre 2009
    Messages : 875
    Points : 1 313
    Points
    1 313
    Par défaut
    Si je peux me permettre, un projet sérieux et évolutif comme le tiens devrais avoir une architecture soignée.

    Je te conseil déjà ceci:
    N'utilise jamaisles méthode magiques find que Doctrine te propose par défaut, utilise plutot des fonctions que tu dois écrire dans ton repository.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class VidéoRepository extends EntityRepository
    {
        public function findMostViewed ($limit = 5) {
     
    		$qb = $this->createQueryBuilder('video')
    		  ->orderBy('video.vues','desc')
                      ->setMaxResults($limit)
    		;
     
    		$results = $qb->getQuery()->getResult();
     
    		return $results ; 
    	}

  4. #4
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci de ton conseil je vais partir sur ce principe dès maintenant.

    Par exemple cette fonction des videos les plus vu je l'intègre a ma class Video.php ?

    Je viens de comprendre que la moitié de mes erreurs étaient dû au fait que dans la création de mes classes auto générées il y avait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     * @ORM\Column(name="ID", type="integer", nullable=false)
         * @ORM\Id
         * @ORM\GeneratedValue(strategy="IDENTITY")
         */
        private $id;
    le name ="ID" créait des erreurs :/

    Voici a quoi ressembles mes fonctions :

    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
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
     
    <?php
     
    namespace itvtube\IienBundle\Entity;
     
    class VideoRepository extends Video
    {
        public function findMostViewed ($limit = 5) {
     
    		$qb = $this	->createQueryBuilder('Video')
    		  			->orderBy('Video.vues','DESC')
                    	->setMaxResults($limit)
                    	;
     
    		$results = $qb->getQuery()->getResult();
     
    		return $results ; 
    	}
     
    	public function findLastProj () {
     
    		$qb = $this	->createQueryBuilder('Proj')
    					->orderBy('Proj.id','DESC')
    					->setMaxResults(1)
    					;
     
    		$results = $qb->getQuery()->getResult();
     
    		return $results ; 
    	}
     
    	public function findFavoris ($iien_id) {
     
    		$qb = $this	->createQueryBuilder('Favori')
    					->where('Favori.iien = $iien_id')
    					;
     
    		$results = $qb->getQuery()->getResult();
     
    		return $results ; 
    	}
     
    	public function findMostFavored ($limit = 5) {
     
    		$qb = $this	->createQueryBuilder('Video')
    		  			->orderBy($qb->expr()->count('Video.favoris'),'DESC')
                    	->setMaxResults($limit)
                    	;
     
    		$results = $qb->getQuery()->getResult();
     
    		return $results ; 
    	}
     
    	public function getArbo () {
     
            $qb = $this	->createQueryBuilder('Annee')
    		  			->orderBy('Proj.id','DESC')
                    	;
     
    		$annees = $qb->getQuery()->getResult();
     
                foreach ($annees as $annee) {
     
                	$annee_id      = $annee -> getId();
                	$annee_label   = $annee -> getLabel()
                    $arbo[] = array($annee_label, $annee_id, array());
     
                    $qb = $this	->createQueryBuilder('Proj')
                    			->where('Proj.annee = $annee_id')
    		  					->orderBy('Proj.id','DESC')
                    			;
     
                    $projs   = $qb->getQuery()->getResult();
                    $index   = count($histo) - 1;
     
                    foreach ($projs as $proj) {
     
                    	$proj_id      = $proj -> getId();
                		$proj_nom   = $proj -> getNom()
                        $arbo[$index][2][] = array($proj_nom, $proj_id);
     
                    }
                }
     
    		return $arbo ; 
    	}
     
    	public function getAnneeVideos ($annee_id) {
     
            $qb = $this	->	createQueryBuilder('Proj')
                    	->	where('Proj.annee = $annee_id')
    		  			->	orderBy('Proj.id','ASC')
                    	;
     
            $projs   = $qb->getQuery()->getResult();
     
            foreach ($projs as $proj) {
     
    			$proj_id = $proj -> getId();
     
    			$qb = $this	->	createQueryBuilder('Video')
                    		->	where('Video.proj = $proj_id')
    		  				->	orderBy('Video.id','ASC')
                    		;
     
            	$videos = 	$qb -> getQuery() -> getResult();
     
            		foreach ($videos as $video) {
            			$results[] = $video
            		}
     
                }
     
    		return $results ; 
    	}
     
    	public function getProjVideos ($proj_id) {
     
    		$qb = $this	->	createQueryBuilder('Video')
                    	->	where('Video.proj = $proj_id')
    		  			->	orderBy('Video.id','ASC')
                    	;
     
            $videos = 	$qb -> getQuery() -> getResult();
     
            	foreach ($videos as $video) {
            		$results[] = $video
            	}
     
    		return $results ; 
    	}
     
    	public function getSearchVideos ($textinput) {
     
     
     
    		return $results ; 
    	}
     
    }
    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
     
    <?php
     
    namespace itvtube\IienBundle\Entity;
     
    class FavoriRepository extends Favori
    {
        public function isFavori ($iien_id, $video_id) {
     
        	$qb = $this	->createQueryBuilder('Iien')
        				->where('Iien.id = $iien_id')
                    	;
     
    		$iien = $qb->getQuery()->getResult();
     
    		$results = $iien -> getFavori() -> getVideos() -> find($video_id);
     
    		return $results ;
        }
     
        public function upFavori ($videos_favori, $video_id) {
     
    		foreach ($videos_favori as $video) {
     
    			$current_video_id = $video -> getId();
     
    			if ($video_id = $current_video_id) {
     
    				$tmp = $video;
     
    				$key = key($video);
    				$videos[$key] = $videos[$key - 1];
    				$videos[$key - 1] = $tmp;
     
    				return $videos ;
    			}
    		}
     
    		return 0;
        }
     
        public function downFavori ($videos_favori, $video_id) {
     
    		foreach ($videos_favori as $video) {
     
    			$current_video_id = $video -> getId();
     
    			if ($video_id = $current_video_id) {
     
    				$tmp = $video;
     
    				$key = key($video);
    				$videos[$key] = $videos[$key + 1];
    				$videos[$key + 1] = $tmp;
     
    				return $videos ;
    			}
    		}
     
    		return 0;
        }
     
    }
    Ma principale difficulté est de faire la fonction de recherche les utilisateur vont pouvoir rechercher sur l'ensemble des tag , année et projection ... comment gérer les fautes de frappe et tt :/ il n'y a pas de fonction pré-faite de recherche ??

    Deuxième problème c'est que certain user aurons accès aux dernières vidéos selon une variable de session(ie un admin aura directement accès , alors qu'un user lamba n'y aura accès que lorsque la date de la projection référencé en base sera dépassée). Le problème que cela me pause c'est que le seul moyen que j'ai trouvé de faire cela c'est en ajoutant dans getVideo la variable de session avec un if. Sauf que cela implique qu'a chaque appel d'une video, ces deux comparaisons soit faites (ie if admin et if date_release>date) ce qui me gène beaucoup car cela n'est utile que pour les 10 dernières video soit dernière projection.
    Quelqu'un aurai t il une solution ?

    Troisième problème mes Objets video n'ont pas encore été ajouté dans la DB du coup a chaque requète en relation avec video il me dit
    Could not convert database value "" to Doctrine Type object
    :/

    Merci de votre aide

  5. #5
    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
    Ma principale difficulté est de faire la fonction de recherche les utilisateur vont pouvoir rechercher sur l'ensemble des tag , année et projection ... comment gérer les fautes de frappe et tt :/ il n'y a pas de fonction pré-faite de recherche ??
    Non. Tu peux mettre en place un champs texte de recherche avec autocomplétion sur ce qui existe pour faire des suggestions, mais tu ne peux jamais empêcher un utilisateur d'être idiot et d'écrire comme un cochon. Si tu veux des résultats de recherche pour des saisies approximatives, je te suggère de te tourner vers un véritable outil de type moteur de recherche.

    Deuxième problème c'est que certain user aurons accès aux dernières vidéos selon une variable de session(ie un admin aura directement accès , alors qu'un user lamba n'y aura accès que lorsque la date de la projection référencé en base sera dépassée). Le problème que cela me pause c'est que le seul moyen que j'ai trouvé de faire cela c'est en ajoutant dans getVideo la variable de session avec un if. Sauf que cela implique qu'a chaque appel d'une video, ces deux comparaisons soit faites (ie if admin et if date_release>date) ce qui me gène beaucoup car cela n'est utile que pour les 10 dernières video soit dernière projection.
    Quelqu'un aurai t il une solution ?
    Retourner des résultats différents en fonction du rôle d'un user connecté est typiquement le genre de problématique sur laquelle je me casse les dents depuis quelques temps pour que ce soit le plus transparent possible pour le développeur et que ça n'ajoute pas des dépendances inutiles un peu partout.
    Il y a pas mal de solutions mais pas beaucoup qui soit vraiment évolutives. Il n'y a aucune solution "simple" qui permette d'éviter ce if, car à un moment donné, il faut faire cette vérification. Si ça t'embête de la faire dans un repository, tu peux la faire au niveau au dessus (le manager qui l'utilise par exemple), mais le problème est le même, tu peux même remonter aussi haut que tu veux et faire des méthodes de manager ou carrément des managers différents, tu seras obligé de faire cette vérification à un moment donné.
    La seule que j'ai trouvé qui évite ce if (qui devient un switch dès lors que tu as plus de cas possibles) est relativement complexe, et demande de mettre en place un système de filtre qui peuvent s'appliquer sur une requête donnée en fonction d'un tableau d'options.

    Grosso modo tu récupères le queryBuilder avec tous tes résultats (qui correspondra sans doute aux résultats que verront les admins), et tu lui demande de filtrer ce QueryBuilder depuis une classe de filtre qui correspond à ton entité en lui passant ton user. C'est cette classe de filtre qui déterminera quel filtre elle doit alors rajouter en fonction du rôle du User.

    Tu peux t'inspirer de cet exemple qui n'est pas en PHP mais dont l'explication est relativement claire http://www.remondo.net/solid-princip...p-open-closed/

    Troisième problème mes Objets video n'ont pas encore été ajouté dans la DB
    Je ne suis pas sûr de comprendre : il ne s'agit là que des URL vers tes vidéos que tu souhaites stocker, pas la vidéo en elle même ? Quel est le problème ?

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/03/2007, 19h20
  2. avis sur une structure css
    Par sardo dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 13/03/2007, 17h19
  3. Votre avis sur la structure de mes tables
    Par mat67000 dans le forum Access
    Réponses: 5
    Dernier message: 07/03/2007, 16h05
  4. [Structure] Aide sur une structure XML (et le vocabulaire associé)
    Par projetdk40 dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 14/02/2007, 10h38
  5. Projet IUT informatique: Demande avis sur clé USB...
    Par ChrisMan dans le forum Périphériques
    Réponses: 8
    Dernier message: 18/03/2006, 10h28

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