获取所有项目,并在Symfony中对关系中使用的项目进行排序

获取所有项目,并在Symfony中对关系中使用的项目进行排序,symfony,relationship,Symfony,Relationship,好的,因此在编辑幻灯片时,用户需要查看所有幻灯片的列表(幻灯片中使用的幻灯片和未使用的幻灯片)。幻灯片放映中使用的幻灯片需要根据交叉点实体进行排序,所有其他幻灯片需要根据ID在这些幻灯片下方进行排序 我有3个实体: 幻灯片放映: /** * @ORM\OneToMany(targetEntity="App\Entity\SlideshowSlideshowSlide", mappedBy="slideshow", fetch="EAGER", indexBy="sort") */ p

好的,因此在编辑幻灯片时,用户需要查看所有幻灯片的列表(幻灯片中使用的幻灯片和未使用的幻灯片)。幻灯片放映中使用的幻灯片需要根据交叉点实体进行排序,所有其他幻灯片需要根据ID在这些幻灯片下方进行排序

我有3个实体:

幻灯片放映:

/**
  * @ORM\OneToMany(targetEntity="App\Entity\SlideshowSlideshowSlide", mappedBy="slideshow", fetch="EAGER", indexBy="sort")
  */
  private $slides;
幻灯片幻灯片放映幻灯片:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Slideshow", inversedBy="slides", fetch="EAGER")
 * @ORM\JoinColumn(name="slideshow_id", nullable=false)
 */
private $slideshow;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\SlideshowSlide", inversedBy="slideshows", fetch="EAGER")
 * @ORM\JoinColumn(nullable=false)
 */
private $slideshowSlide;
/**
 * @ORM\OneToMany(targetEntity="App\Entity\SlideshowSlideshowSlide", mappedBy="slideshow", fetch="EAGER", indexBy="sort")
 */
private $slides;
幻灯片幻灯片:

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\Slideshow", inversedBy="slides", fetch="EAGER")
 * @ORM\JoinColumn(name="slideshow_id", nullable=false)
 */
private $slideshow;

/**
 * @ORM\ManyToOne(targetEntity="App\Entity\SlideshowSlide", inversedBy="slideshows", fetch="EAGER")
 * @ORM\JoinColumn(nullable=false)
 */
private $slideshowSlide;
/**
 * @ORM\OneToMany(targetEntity="App\Entity\SlideshowSlideshowSlide", mappedBy="slideshow", fetch="EAGER", indexBy="sort")
 */
private $slides;
我尝试在我的存储库中添加一个新函数(
SlideshowSlideRepository
):

并将其用作我的渲染:

return $this->render('slideshows/edit.html.twig', [
    'form' => $form->createView(),
    'slides' => $slideshowSlideRepository->findAndSort($slideshow),
    'slideshow' => $slideshow
]);

但是当我转储
幻灯片时,它只有幻灯片中使用的幻灯片,而没有未使用的幻灯片,我看不出我做错了什么。

为什么使用存储库方法? 在幻灯片实体中,应该有一个函数:getSlides()

向您的OneToMany关系添加OrderBy注释:

/**
* @ORM\OneToMany(targetEntity="App\Entity\SlideshowSlideshowSlide", mappedBy="slideshow", fetch="EAGER", indexBy="sort")
* @ORM\OrderBy({"sort" = "DESC"})
*/
private $slides;
并获取此幻灯片放映的所有幻灯片:

return $this->render('slideshows/edit.html.twig', [
    'form' => $form->createView(),
    'slides' => $slideshowSlideRepository->getSlides(),
    'slideshow' => $slideshow
]);
选项#1

在控制器中:

$slideShowSlides = $slideshow->getSlides() // the current slideshow slides, will be sorted by sort coulmn DESC (doctrine annotation)
$otherSlides = $slideshowSlideRepository->getOtherSlides($slideshow);
$slides = new ArrayCollection(
    array_merge($slideShowSlides , $otherSlides)
);
public function getOtherSlides(Slideshow $slideshow)
{
    return $this->createQueryBuilder('s')
        ->where('s.slideshow != :slideshowId')
        ->setParameter('slideshowId', $slideshow->getId())
        ->orderBy('s.id')
        ->getQuery()
        ->getResult();
}
在您的幻灯片库中:

$slideShowSlides = $slideshow->getSlides() // the current slideshow slides, will be sorted by sort coulmn DESC (doctrine annotation)
$otherSlides = $slideshowSlideRepository->getOtherSlides($slideshow);
$slides = new ArrayCollection(
    array_merge($slideShowSlides , $otherSlides)
);
public function getOtherSlides(Slideshow $slideshow)
{
    return $this->createQueryBuilder('s')
        ->where('s.slideshow != :slideshowId')
        ->setParameter('slideshowId', $slideshow->getId())
        ->orderBy('s.id')
        ->getQuery()
        ->getResult();
}
选项2(php排序)


uasort中,您可以按ID/sort等进行额外排序

首先,使用类似“slideshowLinkSlideshow”的内容,而不是“slideshowLinkSlideshow”。你现在所拥有的东西可能会让你的眼睛在阅读时流血。如果你是从SlideshowSlideRepository开始的,我会加入.slides。这一切都很令人困惑。where条件将过滤掉特定幻灯片中没有的所有内容,因此您不会得到未使用的幻灯片也就不足为奇了。最后,一旦你拿到了所有的幻灯片,我希望你需要一个定制的php排序。看起来很好,谢谢(只是说你在
getSlides()
中犯了一个小错误,应该是
findAll()
是的,我犯了一个错误,但不是在这里……应该是$slideshowSlideRepository->getSlides(),而不是$slideshow->getSlides())在Symfony中,这是一个非常强大的方面(在Laravel中很有说服力),你可以从双方获得相关的项目。在你的情况下,你应该有:…
private$slides
;…
public function\uu construct(){$this->slides=new ArrayCollection();}
public function getSlides()):Collection{return$this->slides;}
使用
$slideshow->getSlides()
确实会获取当前幻灯片中的所有幻灯片,但不会获取其他幻灯片。我有点困惑,因为您在存储库函数
->where('slideshowlinkslideshow.id=:slideshowid')中筛选幻灯片
因此,您将只获得当前幻灯片的幻灯片,这是我的一个错误,当时我没有看到(我在想,因为关系需要在某个幻灯片上完成,但因为我使用了left join,所以应该获得所有幻灯片)