aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/Wallabag/CoreBundle/Repository/EntryRepository.php
diff options
context:
space:
mode:
authorJeremy Benoist <jeremy.benoist@gmail.com>2015-12-29 15:08:33 +0100
committerJeremy Benoist <jeremy.benoist@gmail.com>2015-12-29 15:43:32 +0100
commit4059a061c0c8cc787f71e96aef2ab01599d3241d (patch)
tree44265f4985fe9ecf9b601d3414971a62bbc8034d /src/Wallabag/CoreBundle/Repository/EntryRepository.php
parent1bb1939ab76cfbf1cdb5fa1dccbdd15ba17cdfb0 (diff)
downloadwallabag-4059a061c0c8cc787f71e96aef2ab01599d3241d.tar.gz
wallabag-4059a061c0c8cc787f71e96aef2ab01599d3241d.tar.zst
wallabag-4059a061c0c8cc787f71e96aef2ab01599d3241d.zip
Fix the way to remove a tag from all user entries
Diffstat (limited to 'src/Wallabag/CoreBundle/Repository/EntryRepository.php')
-rw-r--r--src/Wallabag/CoreBundle/Repository/EntryRepository.php47
1 files changed, 39 insertions, 8 deletions
diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php
index 9ff80d6e..e658a359 100644
--- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php
+++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php
@@ -183,19 +183,50 @@ class EntryRepository extends EntityRepository
183 183
184 /** 184 /**
185 * Remove a tag from all user entries. 185 * Remove a tag from all user entries.
186 * We are using a native SQL query because Doctrine doesn't know EntryTag entity because it's a ManyToMany relation. 186 *
187 * Instead of that SQL query we should loop on every entry and remove the tag, could be really long ... 187 * We need to loop on each entry attached to the given tag to remove it, since Doctrine doesn't know EntryTag entity because it's a ManyToMany relation.
188 * It could be faster with one query but I don't know how to retrieve the table name `entry_tag` which can have a prefix.
188 * 189 *
189 * @param int $userId 190 * @param int $userId
190 * @param Tag $tag 191 * @param Tag $tag
191 */ 192 */
192 public function removeTag($userId, Tag $tag) 193 public function removeTag($userId, Tag $tag)
193 { 194 {
194 $sql = 'DELETE et FROM entry_tag et WHERE et.entry_id IN ( SELECT e.id FROM entry e WHERE e.user_id = :userId ) AND et.tag_id = :tagId'; 195 $entries = $this->getBuilderByUser($userId)
195 $stmt = $this->getEntityManager()->getConnection()->prepare($sql); 196 ->innerJoin('e.tags', 't')
196 $stmt->execute([ 197 ->andWhere('t.id = :tagId')->setParameter('tagId', $tag->getId())
197 'userId' => $userId, 198 ->getQuery()
198 'tagId' => $tag->getId(), 199 ->getResult();
199 ]); 200
201 foreach ($entries as $entry) {
202 $entry->removeTag($tag);
203 }
204
205 $this->getEntityManager()->flush();
206
207 // An other solution can be to use raw query but I can't find a way to retrieve the `entry_tag` table name since it can be prefixed....
208 // $sql = 'DELETE et FROM entry_tag et WHERE et.entry_id IN ( SELECT e.id FROM entry e WHERE e.user_id = :userId ) AND et.tag_id = :tagId';
209 // $stmt = $this->getEntityManager()->getConnection()->prepare($sql);
210 // $stmt->execute([
211 // 'userId' => $userId,
212 // 'tagId' => $tag->getId(),
213 // ]);
214 }
215
216 /**
217 * Find all entries that are attached to a give tag id.
218 *
219 * @param int $userId
220 * @param int $tagId
221 *
222 * @return array
223 */
224 public function findAllByTagId($userId, $tagId)
225 {
226 return $this->getBuilderByUser($userId)
227 ->innerJoin('e.tags', 't')
228 ->andWhere('t.id = :tagId')->setParameter('tagId', $tagId)
229 ->getQuery()
230 ->getResult();
200 } 231 }
201} 232}