Symfony 6 按关系实体属性排序实体

问题描述 投票:0回答:1

我对 Symfony 还很陌生,我没有找到或不明白如何管理我的问题。

我正在使用 Symfony 6、php 8 和 knppaginator 来显示 CRUD。

我有一个国家/地区实体,它有一个 ID 和一个名称

class Country {
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private int $id;

    #[ORM\Column(length: 255)]
    #[Assert\NotBlank()]
    private string $name;

    #[ORM\OneToMany(mappedBy: 'country', targetEntity: Shop::class, orphanRemoval: true)]
    #[ORM\OrderBy(['name' => 'ASC'])]
    private Collection $shops;

还有一个 Shop 实体,它具有 id、名称以及与 Country 实体的多对一关系

class Shop{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private int $id;

    #[ORM\ManyToOne(inversedBy: 'shops')]
    #[ORM\JoinColumn(nullable: false)]
    private Country $country;

    #[ORM\Column(length: 255)]
    #[Assert\NotBlank()]
    private string $name;

在我的商店索引页面上,我显示一个简单的表 id|商店名称|国家/地区名称。

我可以使用 kpnpaginator 对这些字段进行排序,但国家/地区字段是按 id 排序的。

    public function index(ShopRepository $shopRepository, PaginatorInterface $paginator, Request $request): Response
{
    $shops = $paginator->paginate(
        $shopRepository->findAll(),
        $request->query->getInt('page', 1),
        10
    );

    return $this->render('index.html.twig', [
        'shops' => $shops ,
    ]);
}

我如何按国家/地区名称排序此字段?

sorting symfony doctrine symfony6
1个回答
0
投票

我认为您错过了一段重要的代码,您在控制器中定义了顺序,或者您只使用

OrderBy
属性?如果是这样的话,我相信您混淆了
OrderBy
属性的位置。

OrderBy
属性位于
Country.Shops
属性上,在查询国家/地区时应按名称对商店关系进行排序。如果您想在查询商店时按名称对国家/地区进行排序,则应将
OrderBy
属性放在
Shops.country
上。

这里最重要的问题是您是否真的想这样做,因为这将成为您所有查询的默认设置。此外,如果有很多记录需要分页,您的查询

$shopRepository->findAll()
将变得非常慢,因为它将加载内存中的所有商店并对这些数据进行分页。而不是返回 KpnPaginatorBundle 应该理解的
QueryBuilder
对象,并且只查询需要显示的内容。

我认为您应该在控制器内构建此逻辑,而不是使用 Doctrine Attributes 来实现此目的。尽管如此,这不会影响您的分页功能。

例如,如果您删除

OrderBy
属性,因为您不知道几个月后它的用途,那么您的分页功能现在就会发生变化。但如果你对此感到满意,那就离开吧。

© www.soinside.com 2019 - 2024. All rights reserved.