‪TYPO3CMS  11.5
RelationTest.php
Go to the documentation of this file.
1 <?php
2 
3 declare(strict_types=1);
4 
5 /*
6  * This file is part of the TYPO3 CMS project.
7  *
8  * It is free software; you can redistribute it and/or modify it under
9  * the terms of the GNU General Public License, either version 2
10  * of the License, or any later version.
11  *
12  * For the full copyright and license information, please read the
13  * LICENSE.txt file that was distributed with this source code.
14  *
15  * The TYPO3 project - inspiring people to share!
16  */
17 
19 
36 use TYPO3\TestingFramework\Core\Functional\FunctionalTestCase;
37 
38 class ‪RelationTest extends FunctionalTestCase
39 {
43  protected ‪$blog;
44 
49 
50  protected ‪$testExtensionsToLoad = ['typo3/sysext/extbase/Tests/Functional/Fixtures/Extensions/blog_example'];
51 
55  protected function ‪setUp(): void
56  {
57  parent::setUp();
58 
59  $this->importDataSet('PACKAGE:typo3/testing-framework/Resources/Core/Functional/Fixtures/pages.xml');
60  $this->importCSVDataSet(__DIR__ . '/../Persistence/Fixtures/blogs.csv');
61  $this->importCSVDataSet(__DIR__ . '/../Persistence/Fixtures/posts.csv');
62  $this->importCSVDataSet(__DIR__ . '/../Persistence/Fixtures/persons.csv');
63  $this->importCSVDataSet(__DIR__ . '/../Persistence/Fixtures/tags.csv');
64  $this->importCSVDataSet(__DIR__ . '/../Persistence/Fixtures/tags-mm.csv');
65  $this->importCSVDataSet(__DIR__ . '/../Persistence/Fixtures/post-tag-mm.csv');
66  $this->importCSVDataSet(__DIR__ . '/../Persistence/Fixtures/categories.csv');
67  $this->importCSVDataSet(__DIR__ . '/../Persistence/Fixtures/category-mm.csv');
68 
69  $this->persistentManager = $this->get(PersistenceManager::class);
70  $this->blog = $this->get(BlogRepository::class)->findByUid(1);
71 
72  ‪$GLOBALS['BE_USER'] = new ‪BackendUserAuthentication();
73  ‪$GLOBALS['BE_USER']->workspace = 0;
74  }
75 
81  public function ‪attachPostToBlogAtTheEnd(): void
82  {
83  $queryBuilder = (new ‪ConnectionPool())->getQueryBuilderForTable('tx_blogexample_domain_model_post');
84  $queryBuilder->getRestrictions()->removeAll()->add(new ‪WorkspaceRestriction(0));
85  $countPostsOriginal = $queryBuilder
86  ->count('*')
87  ->from('tx_blogexample_domain_model_post')
88  ->where(
89  $queryBuilder->expr()->eq(
90  'blog',
91  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
92  )
93  )->executeQuery()
94  ->fetchOne();
95 
96  $newPostTitle = 'sdufhisdhuf';
97  $newPost = new ‪Post();
98  $newPost->setBlog($this->blog);
99  $newPost->setTitle($newPostTitle);
100  $newPost->setContent('Bla Bla Bla');
101 
102  $this->blog->addPost($newPost);
103  $this->‪updateAndPersistBlog();
104 
105  $queryBuilder->resetQueryParts();
106  $countPosts = $queryBuilder
107  ->count('*')
108  ->from('tx_blogexample_domain_model_post')
109  ->where(
110  $queryBuilder->expr()->eq(
111  'blog',
112  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
113  )
114  )->executeQuery()
115  ->fetchOne();
116  self::assertEquals($countPostsOriginal + 1, $countPosts);
117 
118  $queryBuilder->resetQueryParts();
119  $post = $queryBuilder
120  ->select('title', 'sorting')
121  ->from('tx_blogexample_domain_model_post')
122  ->where(
123  $queryBuilder->expr()->eq(
124  'blog',
125  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
126  )
127  )->orderBy('sorting', 'DESC')
128  ->executeQuery()
129  ->fetchAssociative();
130  self::assertSame($newPostTitle, $post['title']);
131  self::assertEquals($countPostsOriginal + 1, $post['sorting']);
132  }
133 
139  public function ‪removeLastPostFromBlog(): void
140  {
141  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_domain_model_post');
142  $queryBuilder->getRestrictions()
143  ->removeAll()->add(new DeletedRestriction());
144  $countPostsOriginal = $queryBuilder
145  ->count('*')
146  ->from('tx_blogexample_domain_model_post')
147  ->executeQuery()
148  ->fetchOne();
149 
150  $queryBuilder->resetQueryParts();
151  $post = $queryBuilder
152  ->select('title', 'sorting')
153  ->from('tx_blogexample_domain_model_post')
154  ->where(
155  $queryBuilder->expr()->eq(
156  'blog',
157  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
158  )
159  )->orderBy('sorting', 'DESC')
160  ->executeQuery()
161  ->fetchAssociative();
162  self::assertEquals(10, $post['sorting']);
163 
164  $posts = $this->blog->getPosts();
165  $postsArray = $posts->toArray();
166  $latestPost = array_pop($postsArray);
167 
168  self::assertEquals(10, $latestPost->getUid());
169 
170  $this->blog->removePost($latestPost);
171  $this->‪updateAndPersistBlog();
172 
173  $queryBuilder->resetQueryParts();
174  $countPosts = $queryBuilder
175  ->count('*')
176  ->from('tx_blogexample_domain_model_post')
177  ->executeQuery()
178  ->fetchOne();
179  self::assertEquals($countPostsOriginal - 1, $countPosts);
180 
181  $queryBuilder->resetQueryParts();
182  $post = $queryBuilder
183  ->select('title', 'sorting')
184  ->from('tx_blogexample_domain_model_post')
185  ->where(
186  $queryBuilder->expr()->eq(
187  'uid',
188  $queryBuilder->createNamedParameter($latestPost->getUid(), ‪Connection::PARAM_INT)
189  )
190  )->orderBy('sorting', 'DESC')
191  ->executeQuery()
192  ->fetchAssociative();
193  self::assertNull($post['uid'] ?? null);
194 
195  $queryBuilder->resetQueryParts();
196  $post = $queryBuilder
197  ->select('title', 'sorting')
198  ->from('tx_blogexample_domain_model_post')
199  ->where(
200  $queryBuilder->expr()->eq(
201  'blog',
202  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
203  )
204  )->orderBy('sorting', 'DESC')
205  ->executeQuery()
206  ->fetchAssociative();
207  self::assertSame('Post9', $post['title']);
208  self::assertEquals(9, $post['sorting']);
209  }
210 
216  public function ‪addPostToBlogInTheMiddle(): void
217  {
218  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_domain_model_post');
219  $queryBuilder->getRestrictions()
220  ->removeAll()->add(new DeletedRestriction());
221  $countPostsOriginal = $queryBuilder
222  ->count('*')
223  ->from('tx_blogexample_domain_model_post')
224  ->executeQuery()
225  ->fetchOne();
226 
227  $newPost = new Post();
228 
229  $posts = clone $this->blog->getPosts();
230  $this->blog->getPosts()->removeAll($posts);
231  $counter = 1;
232  $newPostTitle = 'INSERTED POST at position 6';
233  foreach ($posts as $post) {
234  $this->blog->addPost($post);
235  if ($counter === 5) {
236  $newPost->setBlog($this->blog);
237  $newPost->setTitle($newPostTitle);
238  $newPost->setContent('Bla Bla Bla');
239  $this->blog->addPost($newPost);
240  }
241  $counter++;
242  }
243  $this->‪updateAndPersistBlog();
244 
245  $queryBuilder->resetQueryParts();
246  $countPosts = $queryBuilder
247  ->count('*')
248  ->from('tx_blogexample_domain_model_post')
249  ->executeQuery()
250  ->fetchOne();
251  self::assertEquals($countPostsOriginal + 1, $countPosts);
252 
253  //last post
254  $queryBuilder->resetQueryParts();
255  $post = $queryBuilder
256  ->select('title', 'sorting')
257  ->from('tx_blogexample_domain_model_post')
258  ->where(
259  $queryBuilder->expr()->eq(
260  'blog',
261  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
262  )
263  )->orderBy('sorting', 'DESC')
264  ->executeQuery()
265  ->fetchAssociative();
266  self::assertSame('Post10', $post['title']);
267  self::assertEquals(11, $post['sorting']);
268 
269  // check sorting of the post added in the middle
270  $queryBuilder->resetQueryParts();
271  $post = $queryBuilder
272  ->select('title', 'sorting')
273  ->from('tx_blogexample_domain_model_post')
274  ->where(
275  $queryBuilder->expr()->eq(
276  'uid',
277  $queryBuilder->createNamedParameter($newPost->getUid(), ‪Connection::PARAM_INT)
278  )
279  )->orderBy('sorting', 'DESC')
280  ->executeQuery()
281  ->fetchAssociative();
282  self::assertSame($newPostTitle, $post['title']);
283  self::assertEquals(6, $post['sorting']);
284  }
285 
291  public function ‪removeMiddlePostFromBlog(): void
292  {
293  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_domain_model_post');
294  $queryBuilder->getRestrictions()
295  ->removeAll()->add(new DeletedRestriction());
296  $countPostsOriginal = $queryBuilder
297  ->count('*')
298  ->from('tx_blogexample_domain_model_post')
299  ->executeQuery()
300  ->fetchOne();
301 
302  $posts = clone $this->blog->getPosts();
303  $counter = 1;
304  foreach ($posts as $post) {
305  if ($counter === 5) {
306  $this->blog->removePost($post);
307  }
308  $counter++;
309  }
310  $this->‪updateAndPersistBlog();
311 
312  $queryBuilder->resetQueryParts();
313  $countPosts = $queryBuilder
314  ->count('*')
315  ->from('tx_blogexample_domain_model_post')
316  ->executeQuery()
317  ->fetchOne();
318  self::assertEquals($countPostsOriginal - 1, $countPosts);
319 
320  $queryBuilder->resetQueryParts();
321  $post = $queryBuilder
322  ->select('title', 'sorting')
323  ->from('tx_blogexample_domain_model_post')
324  ->where(
325  $queryBuilder->expr()->eq(
326  'blog',
327  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
328  )
329  )->orderBy('sorting', 'DESC')
330  ->executeQuery()
331  ->fetchAssociative();
332  self::assertSame('Post10', $post['title']);
333  self::assertEquals(10, $post['sorting']);
334  }
335 
341  public function ‪movePostFromEndToTheMiddle(): void
342  {
343  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_domain_model_post');
344  $queryBuilder->getRestrictions()
345  ->removeAll()->add(new DeletedRestriction());
346  $countPostsOriginal = $queryBuilder
347  ->count('*')
348  ->from('tx_blogexample_domain_model_post')
349  ->executeQuery()
350  ->fetchOne();
351 
352  $posts = clone $this->blog->getPosts();
353  $postsArray = $posts->toArray();
354  $latestPost = array_pop($postsArray);
355 
356  $this->blog->getPosts()->removeAll($posts);
357  $counter = 0;
358  $postCount = $posts->count();
359  foreach ($posts as $post) {
360  if ($counter !== ($postCount - 1)) {
361  $this->blog->addPost($post);
362  }
363  if ($counter === 4) {
364  $latestPost->setTitle('MOVED POST ' . $latestPost->getTitle());
365  $this->blog->addPost($latestPost);
366  }
367  $counter++;
368  }
369  $this->‪updateAndPersistBlog();
370 
371  $queryBuilder->resetQueryParts();
372  $countPosts = $queryBuilder
373  ->count('*')
374  ->from('tx_blogexample_domain_model_post')
375  ->executeQuery()
376  ->fetchOne();
377  self::assertEquals($countPostsOriginal, $countPosts);
378 
379  $queryBuilder->getRestrictions()->removeAll();
380  $post = $queryBuilder
381  ->select('title', 'sorting')
382  ->from('tx_blogexample_domain_model_post')
383  ->where(
384  $queryBuilder->expr()->eq(
385  'blog',
386  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
387  )
388  )->orderBy('sorting', 'DESC')
389  ->executeQuery()
390  ->fetchAssociative();
391  self::assertSame('Post9', $post['title']);
392  self::assertEquals(10, $post['sorting']);
393 
394  $queryBuilder->resetQueryParts();
395  $post = $queryBuilder
396  ->select('title', 'uid')
397  ->from('tx_blogexample_domain_model_post')
398  ->where(
399  $queryBuilder->expr()->andX(
400  $queryBuilder->expr()->eq(
401  'blog',
402  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
403  ),
404  $queryBuilder->expr()->eq('sorting', $queryBuilder->createNamedParameter(6, ‪Connection::PARAM_INT))
405  )
406  )
407  ->executeQuery()
408  ->fetchAssociative();
409  self::assertSame('MOVED POST Post10', $post['title']);
410  self::assertEquals(10, $post['uid']);
411  }
412 
418  public function ‪attachTagToPostAtTheEnd(): void
419  {
420  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_domain_model_tag');
421  $queryBuilder->getRestrictions()
422  ->removeAll();
423  $countOriginal = $queryBuilder
424  ->count('*')
425  ->from('tx_blogexample_domain_model_tag')
426  ->executeQuery()
427  ->fetchOne();
428 
429  $newTagTitle = 'sdufhisdhuf';
430 
431  $newTag = new Tag($newTagTitle);
432 
433  $postRepository = $this->get(PostRepository::class);
434  $post = $postRepository->findByUid(1);
435  $post->addTag($newTag);
436 
437  $postRepository->update($post);
438  $this->persistentManager->persistAll();
439 
440  $queryBuilder->resetQueryParts();
441  $count = $queryBuilder
442  ->count('*')
443  ->from('tx_blogexample_domain_model_tag')
444  ->executeQuery()
445  ->fetchOne();
446  self::assertEquals($countOriginal + 1, $count);
447 
448  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_post_tag_mm');
449  $queryBuilder->getRestrictions()
450  ->removeAll();
451  $tag = $queryBuilder
452  ->select('uid_foreign')
453  ->from('tx_blogexample_post_tag_mm')
454  ->where(
455  $queryBuilder->expr()->eq(
456  'uid_local',
457  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
458  )
459  )->orderBy('sorting', 'DESC')
460  ->executeQuery()
461  ->fetchAssociative();
462  self::assertEquals($newTag->getUid(), $tag['uid_foreign']);
463  }
464 
470  public function ‪removeLastTagFromPost(): void
471  {
472  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_domain_model_tag');
473  $queryBuilder->getRestrictions()
474  ->removeAll()->add(new DeletedRestriction());
475  $countOriginal = $queryBuilder
476  ->count('*')
477  ->from('tx_blogexample_domain_model_tag')
478  ->executeQuery()
479  ->fetchOne();
480 
481  $postRepository = $this->get(PostRepository::class);
482  $post = $postRepository->findByUid(1);
483  $tags = $post->getTags();
484  $tagsArray = $tags->toArray();
485  $latestTag = array_pop($tagsArray);
486 
487  self::assertEquals(10, $latestTag->getUid());
488 
489  $post->removeTag($latestTag);
490 
491  $postRepository->update($post);
492  $this->persistentManager->persistAll();
493 
494  $queryBuilder->resetQueryParts();
495  $countTags = $queryBuilder
496  ->count('*')
497  ->from('tx_blogexample_domain_model_tag')
498  ->executeQuery()
499  ->fetchOne();
500  self::assertEquals($countOriginal, $countTags);
501 
502  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_post_tag_mm');
503  $queryBuilder->getRestrictions()
504  ->removeAll();
505  $tag = $queryBuilder
506  ->select('uid_foreign')
507  ->from('tx_blogexample_post_tag_mm')
508  ->where(
509  $queryBuilder->expr()->eq(
510  'uid_local',
511  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
512  )
513  )->orderBy('sorting', 'DESC')
514  ->executeQuery()
515  ->fetchAssociative();
516  self::assertEquals(9, $tag['uid_foreign']);
517 
518  $queryBuilder->resetQueryParts();
519  $tag = $queryBuilder
520  ->select('uid_foreign')
521  ->from('tx_blogexample_post_tag_mm')
522  ->where(
523  $queryBuilder->expr()->andX(
524  $queryBuilder->expr()->eq(
525  'uid_local',
526  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
527  ),
528  $queryBuilder->expr()->eq(
529  'uid_foreign',
530  $queryBuilder->createNamedParameter($latestTag->getUid(), ‪Connection::PARAM_INT)
531  )
532  )
533  )->orderBy('sorting', 'DESC')
534  ->executeQuery()
535  ->fetchAssociative();
536  self::assertNull($tag['uid_foreign'] ?? null);
537  }
538 
544  public function ‪addTagToPostInTheMiddle(): void
545  {
546  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_post_tag_mm');
547  $queryBuilder->getRestrictions()
548  ->removeAll();
549  $countTagsOriginal = $queryBuilder
550  ->count('*')
551  ->from('tx_blogexample_post_tag_mm')
552  ->where(
553  $queryBuilder->expr()->eq('uid_local', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
554  )
555  ->executeQuery()
556  ->fetchOne();
557 
558  $postRepository = $this->get(PostRepository::class);
559  $post = $postRepository->findByUid(1);
560  $tags = clone $post->getTags();
561  $post->setTags(new ObjectStorage());
562 
563  // @todo Replace deprecated strftime in php 8.1. Suppress warning in v11.
564  $newTag = new Tag('INSERTED TAG at position 6 : ' . @strftime(''));
565 
566  $counter = 1;
567  foreach ($tags as $tag) {
568  $post->addTag($tag);
569  if ($counter === 5) {
570  $post->addTag($newTag);
571  }
572  $counter++;
573  }
574 
575  $postRepository->update($post);
576  $this->persistentManager->persistAll();
577 
578  $queryBuilder->resetQueryParts();
579  $countTags = $queryBuilder
580  ->count('*')
581  ->from('tx_blogexample_post_tag_mm')
582  ->where(
583  $queryBuilder->expr()->eq('uid_local', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
584  )
585  ->executeQuery()
586  ->fetchOne();
587  self::assertEquals($countTagsOriginal + 1, $countTags);
588 
589  $queryBuilder->resetQueryParts();
590  $tag = $queryBuilder
591  ->select('uid_foreign')
592  ->from('tx_blogexample_post_tag_mm')
593  ->where(
594  $queryBuilder->expr()->eq(
595  'uid_local',
596  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
597  )
598  )->orderBy('sorting', 'DESC')
599  ->executeQuery()
600  ->fetchAssociative();
601  self::assertEquals(10, $tag['uid_foreign']);
602 
603  $queryBuilder->resetQueryParts();
604  $tag = $queryBuilder
605  ->select('uid_foreign')
606  ->from('tx_blogexample_post_tag_mm')
607  ->where(
608  $queryBuilder->expr()->andX(
609  $queryBuilder->expr()->eq(
610  'uid_local',
611  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
612  ),
613  $queryBuilder->expr()->eq('sorting', $queryBuilder->createNamedParameter(6, ‪Connection::PARAM_INT))
614  )
615  )->orderBy('sorting', 'DESC')
616  ->executeQuery()
617  ->fetchAssociative();
618  self::assertEquals($newTag->getUid(), $tag['uid_foreign']);
619  }
620 
626  public function ‪removeMiddleTagFromPost(): void
627  {
628  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_post_tag_mm');
629  $queryBuilder->getRestrictions()
630  ->removeAll();
631  $countTags = $queryBuilder
632  ->count('*')
633  ->from('tx_blogexample_post_tag_mm')
634  ->where(
635  $queryBuilder->expr()->eq('uid_local', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
636  )
637  ->executeQuery()
638  ->fetchOne();
639  self::assertEquals(10, $countTags);
640 
641  $postRepository = $this->get(PostRepository::class);
642  $post = $postRepository->findByUid(1);
643  $tags = clone $post->getTags();
644  $counter = 1;
645  foreach ($tags as $tag) {
646  if ($counter === 5) {
647  $post->removeTag($tag);
648  }
649  $counter++;
650  }
651 
652  $postRepository->update($post);
653  $this->persistentManager->persistAll();
654 
655  $queryBuilder->resetQueryParts();
656  $countTags = $queryBuilder
657  ->count('*')
658  ->from('tx_blogexample_post_tag_mm')
659  ->where(
660  $queryBuilder->expr()->eq('uid_local', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
661  )
662  ->executeQuery()
663  ->fetchOne();
664  self::assertEquals(9, $countTags);
665 
666  $queryBuilder->resetQueryParts();
667  $tag = $queryBuilder
668  ->select('uid_foreign', 'sorting')
669  ->from('tx_blogexample_post_tag_mm')
670  ->where(
671  $queryBuilder->expr()->eq(
672  'uid_local',
673  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
674  )
675  )->orderBy('sorting', 'DESC')
676  ->executeQuery()
677  ->fetchAssociative();
678  self::assertEquals(10, $tag['uid_foreign']);
679  self::assertEquals(10, $tag['sorting']);
680 
681  $queryBuilder->resetQueryParts();
682  $tag = $queryBuilder
683  ->select('uid_foreign')
684  ->from('tx_blogexample_post_tag_mm')
685  ->where(
686  $queryBuilder->expr()->andX(
687  $queryBuilder->expr()->eq(
688  'uid_local',
689  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
690  ),
691  $queryBuilder->expr()->eq('sorting', $queryBuilder->createNamedParameter(5, ‪Connection::PARAM_INT))
692  )
693  )
694  ->executeQuery()
695  ->fetchAssociative();
696  self::assertNull($tag['uid_foreign'] ?? null);
697  }
698 
704  public function ‪moveTagFromEndToTheMiddle(): void
705  {
706  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_post_tag_mm');
707  $queryBuilder->getRestrictions()
708  ->removeAll();
709  $countTags = $queryBuilder
710  ->count('*')
711  ->from('tx_blogexample_post_tag_mm')
712  ->where(
713  $queryBuilder->expr()->eq('uid_local', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
714  )
715  ->executeQuery()
716  ->fetchOne();
717  self::assertEquals(10, $countTags);
718 
719  $postRepository = $this->get(PostRepository::class);
720  $post = $postRepository->findByUid(1);
721  $tags = clone $post->getTags();
722  $tagsArray = $tags->toArray();
723  $latestTag = array_pop($tagsArray);
724  $post->removeTag($latestTag);
725  $post->setTags(new ObjectStorage());
726 
727  $counter = 1;
728  $tagCount = $tags->count();
729  foreach ($tags as $tag) {
730  if ($counter !== $tagCount) {
731  $post->addTag($tag);
732  }
733  if ($counter === 5) {
734  $post->addTag($latestTag);
735  }
736  $counter++;
737  }
738  $post->addTag($latestTag);
739 
740  $postRepository->update($post);
741  $this->persistentManager->persistAll();
742 
743  $queryBuilder->resetQueryParts();
744  $countTags = $queryBuilder
745  ->count('*')
746  ->from('tx_blogexample_post_tag_mm')
747  ->where(
748  $queryBuilder->expr()->eq('uid_local', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
749  )
750  ->executeQuery()
751  ->fetchOne();
752  self::assertEquals(10, $countTags);
753 
754  $queryBuilder->resetQueryParts();
755  $tag = $queryBuilder
756  ->select('uid_foreign', 'sorting')
757  ->from('tx_blogexample_post_tag_mm')
758  ->where(
759  $queryBuilder->expr()->eq(
760  'uid_local',
761  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
762  )
763  )->orderBy('sorting', 'DESC')
764  ->executeQuery()
765  ->fetchAssociative();
766  self::assertEquals(9, $tag['uid_foreign']);
767  self::assertEquals(10, $tag['sorting']);
768 
769  $sorting = '6';
770  $queryBuilder->resetQueryParts();
771  $tag = $queryBuilder
772  ->select('uid_foreign')
773  ->from('tx_blogexample_post_tag_mm')
774  ->where(
775  $queryBuilder->expr()->andX(
776  $queryBuilder->expr()->eq(
777  'uid_local',
778  $queryBuilder->createNamedParameter($post->getUid(), ‪Connection::PARAM_INT)
779  ),
780  $queryBuilder->expr()->eq(
781  'sorting',
782  $queryBuilder->createNamedParameter($sorting, ‪Connection::PARAM_STR)
783  )
784  )
785  )
786  ->executeQuery()
787  ->fetchAssociative();
788  self::assertEquals(10, $tag['uid_foreign']);
789  }
790 
796  public function ‪timestampFieldIsUpdatedOnPostSave(): void
797  {
798  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('tx_blogexample_domain_model_post');
799  $queryBuilder->getRestrictions()
800  ->removeAll();
801  $rawPost = $queryBuilder
802  ->select('*')
803  ->from('tx_blogexample_domain_model_post')
804  ->where(
805  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
806  )
807  ->executeQuery()
808  ->fetchAssociative();
809 
810  $postRepository = $this->get(PostRepository::class);
811  $post = $postRepository->findByUid(1);
812  $post->setTitle('newTitle');
813 
814  $postRepository->update($post);
815  $this->persistentManager->persistAll();
816 
817  $queryBuilder->resetQueryParts();
818  $rawPost2 = $queryBuilder
819  ->select('*')
820  ->from('tx_blogexample_domain_model_post')
821  ->where(
822  $queryBuilder->expr()->eq('uid', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT))
823  )
824  ->executeQuery()
825  ->fetchAssociative();
826  self::assertTrue($rawPost2['tstamp'] > $rawPost['tstamp']);
827  }
828 
834  public function ‪mmRelationWithoutMatchFieldIsResolved(): void
835  {
836  $postRepository = $this->get(PostRepository::class);
837  $posts = $postRepository->findByTagAndBlog('Tag2', $this->blog);
838  self::assertCount(1, $posts);
839  }
840 
845  {
846  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('sys_category_record_mm');
847  $queryBuilder->getRestrictions()
848  ->removeAll();
849  $countCategories = $queryBuilder
850  ->count('*')
851  ->from('sys_category_record_mm')
852  ->where(
853  $queryBuilder->expr()->andX(
854  $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT)),
855  $queryBuilder->expr()->eq(
856  'tablenames',
857  $queryBuilder->createNamedParameter('tx_blogexample_domain_model_post', ‪Connection::PARAM_STR)
858  ),
859  $queryBuilder->expr()->eq(
860  'fieldname',
861  $queryBuilder->createNamedParameter('categories', ‪Connection::PARAM_STR)
862  )
863  )
864  )
865  ->executeQuery()
866  ->fetchOne();
867  self::assertEquals(4, $countCategories);
868 
869  $postRepository = $this->get(PostRepository::class);
870  $post = $postRepository->findByUid(1);
871  self::assertCount(3, $post->getCategories());
872  }
873 
880  {
881  $postRepository = $this->get(PostRepository::class);
882  $posts = $postRepository->findByCategory(1);
883  self::assertCount(2, $posts);
884 
885  $posts = $postRepository->findByCategory(4);
886  self::assertCount(0, $posts);
887  }
888 
893  {
894  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('sys_category_record_mm');
895  $queryBuilder->getRestrictions()
896  ->removeAll();
897  $countCategories = $queryBuilder
898  ->count('*')
899  ->from('sys_category_record_mm')
900  ->where(
901  $queryBuilder->expr()->andX(
902  $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT)),
903  $queryBuilder->expr()->eq(
904  'tablenames',
905  $queryBuilder->createNamedParameter('tx_blogexample_domain_model_post', ‪Connection::PARAM_STR)
906  ),
907  $queryBuilder->expr()->eq(
908  'fieldname',
909  $queryBuilder->createNamedParameter('categories', ‪Connection::PARAM_STR)
910  )
911  )
912  )
913  ->executeQuery()
914  ->fetchOne();
915  self::assertEquals(4, $countCategories);
916 
917  $postRepository = $this->get(PostRepository::class);
918  $post = $postRepository->findByUid(1);
919 
920  $newCategory = new Category();
921  $newCategory->setTitle('New Category');
922 
923  $post->addCategory($newCategory);
924 
925  $postRepository->update($post);
926  $this->persistentManager->persistAll();
927 
928  $queryBuilder->resetQueryParts();
929  $countCategories = $queryBuilder
930  ->count('*')
931  ->from('sys_category_record_mm')
932  ->where(
933  $queryBuilder->expr()->andX(
934  $queryBuilder->expr()->eq('uid_foreign', $queryBuilder->createNamedParameter(1, ‪Connection::PARAM_INT)),
935  $queryBuilder->expr()->eq(
936  'tablenames',
937  $queryBuilder->createNamedParameter('tx_blogexample_domain_model_post', ‪Connection::PARAM_STR)
938  ),
939  $queryBuilder->expr()->eq(
940  'fieldname',
941  $queryBuilder->createNamedParameter('categories', ‪Connection::PARAM_STR)
942  )
943  )
944  )
945  ->executeQuery()
946  ->fetchOne();
947  self::assertEquals(5, $countCategories);
948  }
949 
956  {
957  $postRepository = $this->get(PostRepository::class);
958  $post = $postRepository->findByUid(1);
959  // Move category down
960  foreach ($post->getCategories() as $category) {
961  $post->removeCategory($category);
962  $post->addCategory($category);
963  break;
964  }
965  $postRepository->update($post);
966  $this->persistentManager->persistAll();
967 
968  // re-fetch Post and Blog
969  $queryBuilder = (new ConnectionPool())->getQueryBuilderForTable('sys_category_record_mm');
970  $queryBuilder->getRestrictions()
971  ->removeAll();
972  $newBlogCategoryCount = $queryBuilder
973  ->count('*')
974  ->from('sys_category_record_mm')
975  ->where(
976  $queryBuilder->expr()->andX(
977  $queryBuilder->expr()->eq(
978  'uid_foreign',
979  $queryBuilder->createNamedParameter($this->blog->getUid(), ‪Connection::PARAM_INT)
980  ),
981  $queryBuilder->expr()->eq(
982  'tablenames',
983  $queryBuilder->createNamedParameter('tx_blogexample_domain_model_post', ‪Connection::PARAM_STR)
984  ),
985  $queryBuilder->expr()->eq(
986  'fieldname',
987  $queryBuilder->createNamedParameter('categories', ‪Connection::PARAM_STR)
988  )
989  )
990  )
991  ->executeQuery()
992  ->fetchOne();
993 
994  // one category is hidden, so the expected count has to be one less
995  $newBlogCategoryCount--;
996 
997  self::assertEquals($this->blog->getCategories()->count(), $newBlogCategoryCount);
998  }
999 
1003  public function ‪distinctDataProvider(): array
1004  {
1005  return [
1006  'order default' => [
1007  [],
1008  ],
1009  'order default, offset 0' => [
1010  [
1011  'offset' => 0,
1012  ],
1013  ],
1014  'order default, limit 100' => [
1015  [
1016  'limit' => 100,
1017  ],
1018  ],
1019  'order default, offset 0, limit 100' => [
1020  [
1021  'offset' => 0,
1022  'limit' => 100,
1023  ],
1024  ],
1025  'order false' => [
1026  [
1027  'order' => false,
1028  ],
1029  ],
1030  'order false, offset 0' => [
1031  [
1032  'order' => false,
1033  'offset' => 0,
1034  ],
1035  ],
1036  'order false, limit 100' => [
1037  [
1038  'order' => false, 'limit' => 100,
1039  ],
1040  ],
1041  'order false, offset 0, limit 100' => [
1042  [
1043  'order' => false,
1044  'offset' => 0,
1045  'limit' => 100,
1046  ],
1047  ],
1048  'order uid, offset 0' => [
1049  [
1050  'order' => ['uid' => ‪QueryInterface::ORDER_ASCENDING],
1051  'offset' => 0,
1052  ],
1053  ],
1054  'order uid, limit 100' => [
1055  [
1056  'order' => ['uid' => ‪QueryInterface::ORDER_ASCENDING],
1057  'limit' => 100,
1058  ],
1059  ],
1060  'order uid, offset 0, limit 100' => [
1061  [
1062  'order' => ['uid' => ‪QueryInterface::ORDER_ASCENDING],
1063  'offset' => 0,
1064  'limit' => 100,
1065  ],
1066  ],
1067  ];
1068  }
1069 
1074  protected function ‪applyQueryRequest(QueryInterface $query, array $queryRequest): void
1075  {
1076  if (isset($queryRequest['order']) && !$queryRequest['order']) {
1077  $query->setOrderings([]);
1078  } elseif (!empty($queryRequest['order'])) {
1079  $query->setOrderings($queryRequest['order']);
1080  }
1081  if (isset($queryRequest['offset'])) {
1082  $query->setOffset($queryRequest['offset']);
1083  }
1084  if (isset($queryRequest['limit'])) {
1085  $query->setLimit($queryRequest['limit']);
1086  }
1087  }
1088 
1094  public function ‪distinctPersonEntitiesAreFoundByPublisher(array $queryRequest): void
1095  {
1096  $query = $this->‪provideFindPostsByPublisherQuery(1);
1097  $this->‪applyQueryRequest($query, $queryRequest);
1098  $posts = $query->execute();
1099  $postCount = $posts->count();
1100 
1101  $postIds = $this->‪resolveEntityIds($posts->toArray());
1102 
1103  self::assertEquals($this->‪countDistinctIds($postIds), $postCount);
1104  $this->‪assertDistinctIds($postIds);
1105  }
1106 
1112  public function ‪distinctPersonRecordsAreFoundByPublisher(array $queryRequest): void
1113  {
1114  $query = $this->‪provideFindPostsByPublisherQuery(1);
1115  $this->‪applyQueryRequest($query, $queryRequest);
1116  $postRecords = $query->execute(true);
1117  $postIds = $this->‪resolveRecordIds($postRecords);
1118 
1119  $this->‪assertDistinctIds($postIds);
1120  }
1121 
1126  protected function ‪provideFindPostsByPublisherQuery(int $publisherId): QueryInterface
1127  {
1128  $postRepository = $this->get(PostRepository::class);
1129  $query = $postRepository->createQuery();
1130  $query->matching(
1131  $query->logicalOr([
1132  $query->equals('author.uid', $publisherId),
1133  $query->equals('reviewer.uid', $publisherId),
1134  ])
1135  );
1136  return $query;
1137  }
1138 
1144  public function ‪distinctBlogEntitiesAreFoundByPostsSince(array $queryRequest): void
1145  {
1146  $query = $this->‪provideFindBlogsByPostsSinceQuery(
1147  new \DateTime('2017-08-01')
1148  );
1149  $this->‪applyQueryRequest($query, $queryRequest);
1150  $blogs = $query->execute();
1151  $blogCount = $blogs->count();
1152 
1153  $blogIds = $this->‪resolveEntityIds($blogs->toArray());
1154 
1155  self::assertEquals($this->‪countDistinctIds($blogIds), $blogCount);
1156  $this->‪assertDistinctIds($blogIds);
1157  }
1158 
1164  public function ‪distinctBlogRecordsAreFoundByPostsSince(array $queryRequest): void
1165  {
1166  $query = $this->‪provideFindBlogsByPostsSinceQuery(
1167  new \DateTime('2017-08-01')
1168  );
1169  $this->‪applyQueryRequest($query, $queryRequest);
1170  $blogRecords = $query->execute(true);
1171  $blogIds = $this->‪resolveRecordIds($blogRecords);
1172 
1173  $this->‪assertDistinctIds($blogIds);
1174  }
1175 
1180  protected function ‪provideFindBlogsByPostsSinceQuery(\DateTime $date): QueryInterface
1181  {
1182  $blogRepository = $this->get(BlogRepository::class);
1183  $query = $blogRepository->createQuery();
1184  $query->matching(
1185  $query->greaterThanOrEqual('posts.date', $date)
1186  );
1187  return $query;
1188  }
1189 
1195  public function ‪distinctPersonEntitiesAreFoundByTagNameAreFiltered(array $queryRequest): void
1196  {
1197  $query = $this->‪provideFindPersonsByTagNameQuery('SharedTag');
1198  $this->‪applyQueryRequest($query, $queryRequest);
1199  $persons = $query->execute();
1200  $personCount = $persons->count();
1201 
1202  $personIds = $this->‪resolveEntityIds($persons->toArray());
1203 
1204  self::assertEquals($this->‪countDistinctIds($personIds), $personCount);
1205  $this->‪assertDistinctIds($personIds);
1206  }
1207 
1213  public function ‪distinctPersonRecordsAreFoundByTagNameAreFiltered(array $queryRequest): void
1214  {
1215  $query = $this->‪provideFindPersonsByTagNameQuery('SharedTag');
1216  $this->‪applyQueryRequest($query, $queryRequest);
1217  $personRecords = $query->execute(true);
1218  $personIds = $this->‪resolveRecordIds($personRecords);
1219 
1220  $this->‪assertDistinctIds($personIds);
1221  }
1222 
1227  protected function ‪provideFindPersonsByTagNameQuery(string $tagName): QueryInterface
1228  {
1229  $personRepository = $this->get(PersonRepository::class);
1230  $query = $personRepository->createQuery();
1231  $query->matching(
1232  $query->logicalOr([
1233  $query->equals('tags.name', $tagName),
1234  $query->equals('tagsSpecial.name', $tagName),
1235  ])
1236  );
1237  return $query;
1238  }
1239 
1245  public function ‪distinctPostEntitiesAreFoundByAuthorTagNameAreFiltered(array $queryRequest): void
1246  {
1247  $query = $this->‪provideFindPostsByAuthorTagName('SharedTag');
1248  $this->‪applyQueryRequest($query, $queryRequest);
1249  $posts = $query->execute();
1250  $postCount = $posts->count();
1251 
1252  $postsIds = $this->‪resolveEntityIds($posts->toArray());
1253 
1254  self::assertEquals($this->‪countDistinctIds($postsIds), $postCount);
1255  $this->‪assertDistinctIds($postsIds);
1256  }
1257 
1263  public function ‪distinctPostRecordsAreFoundByAuthorTagNameAreFiltered(array $queryRequest): void
1264  {
1265  $query = $this->‪provideFindPostsByAuthorTagName('SharedTag');
1266  $this->‪applyQueryRequest($query, $queryRequest);
1267  $postRecords = $query->execute(true);
1268  $postsIds = $this->‪resolveRecordIds($postRecords);
1269 
1270  $this->‪assertDistinctIds($postsIds);
1271  }
1272 
1277  protected function ‪provideFindPostsByAuthorTagName(string $tagName): QueryInterface
1278  {
1279  $postRepository = $this->get(PostRepository::class);
1280  $query = $postRepository->createQuery();
1281  $query->matching(
1282  $query->logicalOr([
1283  $query->equals('author.tags.name', $tagName),
1284  $query->equals('author.tagsSpecial.name', $tagName),
1285  ])
1286  );
1287  return $query;
1288  }
1289 
1293  protected function ‪updateAndPersistBlog(): void
1294  {
1295  $blogRepository = $this->get(BlogRepository::class);
1296  $blogRepository->update($this->blog);
1297  $this->persistentManager->persistAll();
1298  }
1299 
1304  protected function ‪resolveEntityIds(array $entities): array
1305  {
1306  return array_map(
1307  static function (AbstractEntity $entity) {
1308  return $entity->getUid();
1309  },
1310  $entities
1311  );
1312  }
1313 
1318  protected function ‪resolveRecordIds(array $records): array
1319  {
1320  return array_column($records, 'uid');
1321  }
1322 
1329  protected function ‪countDistinctIds(array $ids): int
1330  {
1331  return count(array_unique($ids));
1332  }
1333 
1340  protected function ‪assertDistinctIds(array $ids): void
1341  {
1342  $counts = array_count_values($ids);
1343  self::assertEquals(count($counts), array_sum($counts));
1344  }
1345 }
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\attachTagToPostAtTheEnd
‪attachTagToPostAtTheEnd()
Definition: RelationTest.php:416
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\provideFindBlogsByPostsSinceQuery
‪QueryInterface provideFindBlogsByPostsSinceQuery(\DateTime $date)
Definition: RelationTest.php:1178
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctPersonRecordsAreFoundByTagNameAreFiltered
‪distinctPersonRecordsAreFoundByTagNameAreFiltered(array $queryRequest)
Definition: RelationTest.php:1211
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\provideFindPersonsByTagNameQuery
‪QueryInterface provideFindPersonsByTagNameQuery(string $tagName)
Definition: RelationTest.php:1225
‪ExtbaseTeam\BlogExample\Domain\Repository\BlogRepository
Definition: BlogRepository.php:27
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\moveTagFromEndToTheMiddle
‪moveTagFromEndToTheMiddle()
Definition: RelationTest.php:702
‪ExtbaseTeam\BlogExample\Domain\Model\Category
Definition: Category.php:28
‪TYPO3\CMS\Core\Database\Connection\PARAM_INT
‪const PARAM_INT
Definition: Connection.php:49
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\mmRelationWithMatchFieldIsResolvedFromForeignSide
‪mmRelationWithMatchFieldIsResolvedFromForeignSide()
Definition: RelationTest.php:877
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\updateAndPersistBlog
‪updateAndPersistBlog()
Definition: RelationTest.php:1291
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\removeMiddleTagFromPost
‪removeMiddleTagFromPost()
Definition: RelationTest.php:624
‪TYPO3\CMS\Extbase\DomainObject\AbstractDomainObject\getUid
‪int null getUid()
Definition: AbstractDomainObject.php:67
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\$blog
‪Blog $blog
Definition: RelationTest.php:42
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\removeLastPostFromBlog
‪removeLastPostFromBlog()
Definition: RelationTest.php:137
‪TYPO3\CMS\Extbase\Persistence\QueryInterface
Definition: QueryInterface.php:29
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\resolveRecordIds
‪int[] resolveRecordIds(array $records)
Definition: RelationTest.php:1316
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\applyQueryRequest
‪applyQueryRequest(QueryInterface $query, array $queryRequest)
Definition: RelationTest.php:1072
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\mmRelationWithoutMatchFieldIsResolved
‪mmRelationWithoutMatchFieldIsResolved()
Definition: RelationTest.php:832
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\removeMiddlePostFromBlog
‪removeMiddlePostFromBlog()
Definition: RelationTest.php:289
‪ExtbaseTeam\BlogExample\Domain\Repository\PersonRepository
Definition: PersonRepository.php:27
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\movePostFromEndToTheMiddle
‪movePostFromEndToTheMiddle()
Definition: RelationTest.php:339
‪TYPO3\CMS\Extbase\Persistence\QueryInterface\setOrderings
‪TYPO3 CMS Extbase Persistence QueryInterface setOrderings(array $orderings)
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctPersonEntitiesAreFoundByPublisher
‪distinctPersonEntitiesAreFoundByPublisher(array $queryRequest)
Definition: RelationTest.php:1092
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest
Definition: RelationTest.php:39
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\mmRelationWithMatchFieldIsResolvedFromLocalSide
‪mmRelationWithMatchFieldIsResolvedFromLocalSide()
Definition: RelationTest.php:842
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\removeLastTagFromPost
‪removeLastTagFromPost()
Definition: RelationTest.php:468
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\provideFindPostsByAuthorTagName
‪QueryInterface provideFindPostsByAuthorTagName(string $tagName)
Definition: RelationTest.php:1275
‪TYPO3\CMS\Extbase\DomainObject\AbstractEntity
Definition: AbstractEntity.php:22
‪TYPO3\CMS\Core\Database\Connection\PARAM_STR
‪const PARAM_STR
Definition: Connection.php:54
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\resolveEntityIds
‪int[] resolveEntityIds(array $entities)
Definition: RelationTest.php:1302
‪TYPO3\CMS\Extbase\Persistence\ObjectStorage
Definition: ObjectStorage.php:32
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctPostEntitiesAreFoundByAuthorTagNameAreFiltered
‪distinctPostEntitiesAreFoundByAuthorTagNameAreFiltered(array $queryRequest)
Definition: RelationTest.php:1243
‪TYPO3\CMS\Extbase\Persistence\QueryInterface\setOffset
‪TYPO3 CMS Extbase Persistence QueryInterface setOffset($offset)
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctBlogEntitiesAreFoundByPostsSince
‪distinctBlogEntitiesAreFoundByPostsSince(array $queryRequest)
Definition: RelationTest.php:1142
‪TYPO3\CMS\Extbase\Persistence\QueryInterface\ORDER_ASCENDING
‪const ORDER_ASCENDING
Definition: QueryInterface.php:98
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctPersonRecordsAreFoundByPublisher
‪distinctPersonRecordsAreFoundByPublisher(array $queryRequest)
Definition: RelationTest.php:1110
‪TYPO3\CMS\Extbase\Persistence\Generic\PersistenceManager
Definition: PersistenceManager.php:28
‪TYPO3\CMS\Extbase\Persistence\QueryInterface\matching
‪TYPO3 CMS Extbase Persistence QueryInterface matching($constraint)
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctPersonEntitiesAreFoundByTagNameAreFiltered
‪distinctPersonEntitiesAreFoundByTagNameAreFiltered(array $queryRequest)
Definition: RelationTest.php:1193
‪ExtbaseTeam\BlogExample\Domain\Model\Blog
Definition: Blog.php:29
‪ExtbaseTeam\BlogExample\Domain\Model\Post
Definition: Post.php:28
‪TYPO3\CMS\Core\Authentication\BackendUserAuthentication
Definition: BackendUserAuthentication.php:62
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\addTagToPostInTheMiddle
‪addTagToPostInTheMiddle()
Definition: RelationTest.php:542
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence
Definition: AddTest.php:18
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\adjustingMmRelationWithTablesnameAndFieldnameFieldDoNotTouchOtherRelations
‪adjustingMmRelationWithTablesnameAndFieldnameFieldDoNotTouchOtherRelations()
Definition: RelationTest.php:953
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\provideFindPostsByPublisherQuery
‪QueryInterface provideFindPostsByPublisherQuery(int $publisherId)
Definition: RelationTest.php:1124
‪TYPO3\CMS\Core\Database\Connection
Definition: Connection.php:38
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctBlogRecordsAreFoundByPostsSince
‪distinctBlogRecordsAreFoundByPostsSince(array $queryRequest)
Definition: RelationTest.php:1162
‪TYPO3\CMS\Extbase\Persistence\QueryInterface\setLimit
‪TYPO3 CMS Extbase Persistence QueryInterface setLimit($limit)
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\$testExtensionsToLoad
‪$testExtensionsToLoad
Definition: RelationTest.php:48
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\assertDistinctIds
‪assertDistinctIds(array $ids)
Definition: RelationTest.php:1338
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\addPostToBlogInTheMiddle
‪addPostToBlogInTheMiddle()
Definition: RelationTest.php:214
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctDataProvider
‪array distinctDataProvider()
Definition: RelationTest.php:1001
‪$GLOBALS
‪$GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['adminpanel']['modules']
Definition: ext_localconf.php:25
‪TYPO3\CMS\Core\Database\Query\Restriction\DeletedRestriction
Definition: DeletedRestriction.php:28
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\setUp
‪setUp()
Definition: RelationTest.php:53
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\attachPostToBlogAtTheEnd
‪attachPostToBlogAtTheEnd()
Definition: RelationTest.php:79
‪TYPO3\CMS\Core\Database\ConnectionPool
Definition: ConnectionPool.php:46
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\timestampFieldIsUpdatedOnPostSave
‪timestampFieldIsUpdatedOnPostSave()
Definition: RelationTest.php:794
‪ExtbaseTeam\BlogExample\Domain\Repository\PostRepository
Definition: PostRepository.php:32
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\countDistinctIds
‪int countDistinctIds(array $ids)
Definition: RelationTest.php:1327
‪ExtbaseTeam\BlogExample\Domain\Model\Tag
Definition: Tag.php:26
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\mmRelationWithMatchFieldIsCreatedFromLocalSide
‪mmRelationWithMatchFieldIsCreatedFromLocalSide()
Definition: RelationTest.php:890
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\distinctPostRecordsAreFoundByAuthorTagNameAreFiltered
‪distinctPostRecordsAreFoundByAuthorTagNameAreFiltered(array $queryRequest)
Definition: RelationTest.php:1261
‪TYPO3\CMS\Extbase\Tests\Functional\Persistence\RelationTest\$persistentManager
‪PersistenceManager $persistentManager
Definition: RelationTest.php:46
‪TYPO3\CMS\Core\Database\Query\Restriction\WorkspaceRestriction
Definition: WorkspaceRestriction.php:40