|
@@ -32,45 +32,61 @@ class ElementRepository extends EntityRepository
|
32
|
32
|
* @return Doctrine\ORM\Query
|
33
|
33
|
*/
|
34
|
34
|
public function findBySearch(ElementSearcher $searcher, $user_id)
|
35
|
|
- {
|
36
|
|
- $params = array();
|
37
|
|
- $join_personal = '';
|
38
|
|
- //$query_with = '';
|
39
|
|
- $where = '';
|
|
35
|
+ {
|
|
36
|
+ // Tableaux des paramétres
|
|
37
|
+ $params_ids = array();
|
|
38
|
+ $params_select = array();
|
|
39
|
+ $params_select['uid'] = $user_id;
|
|
40
|
+
|
|
41
|
+ // Booléen nous permettant de savoir si un where a déjà été écrit
|
|
42
|
+ $is_where = false;
|
40
|
43
|
|
41
|
|
- // ajout du filtres de trie avec les tags transmis
|
42
|
|
- foreach ($searcher->getTags() as $tag_id)
|
|
44
|
+ // Construction des conditions pour la selection d'ids
|
|
45
|
+ $where_tags = '';
|
|
46
|
+ $join_tags = '';
|
|
47
|
+ if (count(($tags = $searcher->getTags())))
|
43
|
48
|
{
|
44
|
|
- if ($where == '')
|
45
|
|
- {
|
46
|
|
- $where .= 'WHERE (t.id = :tid'.$tag_id;
|
47
|
|
- }
|
48
|
|
- else
|
|
49
|
+ foreach ($tags as $tag_id)
|
49
|
50
|
{
|
50
|
|
- $where .= ' OR t.id = :tid'.$tag_id;
|
|
51
|
+ // LEFT JOIN car un element n'est pas obligatoirement lié a un/des tags
|
|
52
|
+ $join_tags = " LEFT JOIN e_.tags t_";
|
|
53
|
+
|
|
54
|
+ // Construction du chere pour les tags
|
|
55
|
+ if ($where_tags == '')
|
|
56
|
+ {
|
|
57
|
+ $where_tags .= ' WHERE (t_.id = :tid'.$tag_id;
|
|
58
|
+ }
|
|
59
|
+ else
|
|
60
|
+ {
|
|
61
|
+ $where_tags .= ' OR t_.id = :tid'.$tag_id;
|
|
62
|
+ }
|
|
63
|
+ $params_ids['tid'.$tag_id] = $tag_id;
|
51
|
64
|
}
|
52
|
|
- $params['tid'.$tag_id] = $tag_id;
|
|
65
|
+ // Fermeture de la parenthése qui isole la condition des tags
|
|
66
|
+ $where_tags .= ')';
|
|
67
|
+ $is_where = true;
|
53
|
68
|
}
|
54
|
69
|
|
55
|
|
- if (count($searcher->getTags()))
|
56
|
|
- {
|
57
|
|
- // Si on ne met pas les parenthéses, lorsqu'il y a d'autre where (AND, OR)
|
58
|
|
- // On perd la précision et des résultats se retrouvent dans le tas
|
59
|
|
- $where .= ')';
|
60
|
|
- }
|
61
|
|
-
|
62
|
|
- // Ajout du filtre limitant au réseau personel si c'est le cas
|
|
70
|
+ // Construction de la condition network
|
|
71
|
+ $join_network = '';
|
63
|
72
|
$where_network = '';
|
64
|
73
|
if ($searcher->getNetwork() == ElementSearcher::NETWORK_PERSONAL)
|
65
|
74
|
{
|
66
|
|
- $join_personal =
|
67
|
|
- " LEFT JOIN eu.followers_users f"
|
68
|
|
- ." LEFT JOIN g.followers gf"
|
|
75
|
+ $join_network =
|
|
76
|
+ " JOIN e_.owner o_"
|
|
77
|
+ // LEFT JOIN car l'element n'est pas obligatoirement lié a un groupe
|
|
78
|
+ . " LEFT JOIN e_.group g_"
|
|
79
|
+ // LEFT JOIN car owner n'est pas obligatoirement lié a des followers
|
|
80
|
+ . " LEFT JOIN o_.followers_users f_"
|
|
81
|
+ // LEFT JOIN car le groupe n'est pas obligatoirement lié a des followers
|
|
82
|
+ . " LEFT JOIN g_.followers gf_"
|
69
|
83
|
;
|
70
|
|
- $where_network = ($where != '') ? ' AND' : ' WHERE';
|
71
|
|
- $where_network .= ' (f.follower = :userid OR gf.follower = :useridg)';
|
72
|
|
- $params['userid'] = $user_id;
|
73
|
|
- $params['useridg'] = $user_id;
|
|
84
|
+ $where_network = ($is_where) ? ' AND' : ' WHERE';
|
|
85
|
+ // Le filtre applique: Soit le proprio fait partis des followeds de l'utilisateur
|
|
86
|
+ // soit l'element est ajouté dans un groupe que l'utilisateur follow.
|
|
87
|
+ $where_network .= ' (f_.follower = :userid OR gf_.follower = :useridg)';
|
|
88
|
+ $params_ids['userid'] = $user_id;
|
|
89
|
+ $params_ids['useridg'] = $user_id;
|
74
|
90
|
}
|
75
|
91
|
|
76
|
92
|
// ajout du filtre sur un user si c'est le cas
|
|
@@ -79,9 +95,9 @@ class ElementRepository extends EntityRepository
|
79
|
95
|
// de favoris, on ne filtre pas sur le proprio de l'element
|
80
|
96
|
if (($search_user_id = $searcher->getUserId()) && !$searcher->isFavorite())
|
81
|
97
|
{
|
82
|
|
- $where_user = ($where != '') ? ' AND' : ' WHERE';
|
83
|
|
- $where_user .= ' e.owner = :suid';
|
84
|
|
- $params['suid'] = $search_user_id;
|
|
98
|
+ $where_user = ($is_where) ? ' AND' : ' WHERE';
|
|
99
|
+ $where_user .= ' e_.owner = :suid';
|
|
100
|
+ $params_ids['suid'] = $search_user_id;
|
85
|
101
|
}
|
86
|
102
|
|
87
|
103
|
// ajout du filtre sur un user si c'est le cas
|
|
@@ -90,25 +106,27 @@ class ElementRepository extends EntityRepository
|
90
|
106
|
// de favoris, on ne filtre pas sur le proprio de l'element
|
91
|
107
|
if (($search_group_id = $searcher->getGroupId()) && !$searcher->isFavorite())
|
92
|
108
|
{
|
93
|
|
- $where_group = ($where != '') ? ' AND' : ' WHERE';
|
94
|
|
- $where_group .= ' e.group = :sgid';
|
95
|
|
- $params['sgid'] = $search_group_id;
|
|
109
|
+ $where_group = ($is_where) ? ' AND' : ' WHERE';
|
|
110
|
+ $where_group .= ' e_.group = :sgid';
|
|
111
|
+ $params_ids['sgid'] = $search_group_id;
|
96
|
112
|
}
|
97
|
113
|
|
98
|
|
- // Filtre pour afficher que les elements mis en favoris si c'est la demande
|
99
|
|
- $join_favorite = ''; $where_favorite = '';
|
|
114
|
+ // Filtre pour afficher uniquement les elements mis en favoris
|
|
115
|
+ $join_favorite = '';
|
|
116
|
+ $where_favorite = '';
|
100
|
117
|
if ($searcher->isFavorite())
|
101
|
118
|
{
|
102
|
|
- $where_favorite = ($where != '') ? ' AND' : ' WHERE';
|
|
119
|
+ $where_favorite = ($is_where) ? ' AND' : ' WHERE';
|
103
|
120
|
if (($favorite_user_id = $searcher->getUserId()) && !$searcher->getGroupId())
|
104
|
121
|
{
|
105
|
|
- $join_favorite = 'JOIN e.elements_favorites fav2';
|
106
|
|
- $where_favorite .= ' fav2.user = :fuid';
|
107
|
|
- $params['fuid'] = $favorite_user_id;
|
|
122
|
+ // Pas de LEFT JOIN car on ne veut que les elements mis en favoris
|
|
123
|
+ $join_favorite = 'JOIN e_.elements_favorites fav2_';
|
|
124
|
+ $where_favorite .= ' fav2_.user = :fuid';
|
|
125
|
+ $params_ids['fuid'] = $favorite_user_id;
|
108
|
126
|
}
|
109
|
127
|
else if (($favorite_group_id = $searcher->getGroupId()) && !$searcher->getUserId())
|
110
|
128
|
{
|
111
|
|
- // TODO: Faire en sorte que ça affiche les favrois des gens suivant
|
|
129
|
+ // TODO: Faire en sorte que ça affiche les favoris des gens suivant
|
112
|
130
|
// le groupe
|
113
|
131
|
}
|
114
|
132
|
else
|
|
@@ -117,33 +135,60 @@ class ElementRepository extends EntityRepository
|
117
|
135
|
}
|
118
|
136
|
}
|
119
|
137
|
|
120
|
|
- // Construction de la requête finale
|
121
|
|
- $query_string = "SELECT e, et, t2, eu, g, fav
|
122
|
|
- FROM MuzichCoreBundle:Element e
|
123
|
|
- LEFT JOIN e.group g
|
124
|
|
- LEFT JOIN e.type et
|
125
|
|
- LEFT JOIN e.tags t
|
126
|
|
- LEFT JOIN e.tags t2
|
127
|
|
- LEFT JOIN e.elements_favorites fav WITH fav.user = :uid
|
128
|
|
- $join_favorite
|
129
|
|
- JOIN e.owner eu $join_personal
|
130
|
|
- $where
|
131
|
|
- $where_network
|
132
|
|
- $where_user
|
133
|
|
- $where_group
|
134
|
|
- $where_favorite
|
135
|
|
- GROUP BY e, et, t2, eu, g, fav
|
136
|
|
- ORDER BY e.created DESC, e.name DESC"
|
|
138
|
+ // Requête qui selectionnera les ids en fonction des critéres
|
|
139
|
+ $r_ids = $this->getEntityManager()
|
|
140
|
+ ->createQuery(
|
|
141
|
+ "SELECT e_.id
|
|
142
|
+ FROM MuzichCoreBundle:Element e_
|
|
143
|
+ $join_tags
|
|
144
|
+ $join_network
|
|
145
|
+ $join_favorite
|
|
146
|
+ $where_tags
|
|
147
|
+ $where_network
|
|
148
|
+ $where_user
|
|
149
|
+ $where_group
|
|
150
|
+ $where_favorite
|
|
151
|
+ GROUP BY e_.id
|
|
152
|
+ ORDER BY e_.created DESC, e_.id DESC")
|
|
153
|
+ ->setParameters($params_ids)
|
|
154
|
+ ->setMaxResults($searcher->getCount())
|
|
155
|
+ ->getArrayResult()
|
137
|
156
|
;
|
138
|
|
- $params['uid'] = $user_id;
|
139
|
157
|
|
140
|
|
- $query = $this->getEntityManager()
|
141
|
|
- ->createQuery($query_string)
|
142
|
|
- ->setParameters($params)
|
143
|
|
- ->setMaxResults($searcher->getCount())
|
144
|
|
- ;
|
|
158
|
+ $ids = array();
|
|
159
|
+
|
|
160
|
+ if (count($r_ids))
|
|
161
|
+ {
|
|
162
|
+ foreach ($r_ids as $r_id)
|
|
163
|
+ {
|
|
164
|
+ $ids[] = $r_id['id'];
|
|
165
|
+ }
|
|
166
|
+
|
|
167
|
+ // C'est la requête qui récupérera les données element avec ses jointures.
|
|
168
|
+ $query_select = "SELECT e, ty, t, o, g, fav
|
|
169
|
+ FROM MuzichCoreBundle:Element e
|
|
170
|
+ LEFT JOIN e.group g
|
|
171
|
+ LEFT JOIN e.type ty
|
|
172
|
+ LEFT JOIN e.tags t
|
|
173
|
+ LEFT JOIN e.elements_favorites fav WITH fav.user = :uid
|
|
174
|
+ JOIN e.owner o
|
|
175
|
+ WHERE e.id IN (:ids)
|
|
176
|
+ ORDER BY e.created DESC, e.id DESC"
|
|
177
|
+ ;
|
|
178
|
+
|
|
179
|
+ $params_select['ids'] = $ids;
|
|
180
|
+ $query = $this->getEntityManager()
|
|
181
|
+ ->createQuery($query_select)
|
|
182
|
+ ->setParameters($params_select)
|
|
183
|
+ ;
|
|
184
|
+
|
|
185
|
+ return $query;
|
|
186
|
+ }
|
145
|
187
|
|
146
|
|
- return $query;
|
|
188
|
+ // Il faut retourner une Query
|
|
189
|
+ return $query = $this->getEntityManager()
|
|
190
|
+ ->createQuery("SELECT e FROM MuzichCoreBundle:Element e WHERE 1 = 2")
|
|
191
|
+ ;
|
147
|
192
|
}
|
148
|
193
|
|
149
|
194
|
/**
|