我对 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 ,
]);
}
我如何按国家/地区名称排序此字段?
我认为您错过了一段重要的代码,您在控制器中定义了顺序,或者您只使用
OrderBy
属性?如果是这样的话,我相信您混淆了 OrderBy
属性的位置。
OrderBy
属性位于 Country.Shops
属性上,在查询国家/地区时应按名称对商店关系进行排序。如果您想在查询商店时按名称对国家/地区进行排序,则应将 OrderBy
属性放在 Shops.country
上。
这里最重要的问题是您是否真的想这样做,因为这将成为您所有查询的默认设置。此外,如果有很多记录需要分页,您的查询
$shopRepository->findAll()
将变得非常慢,因为它将加载内存中的所有商店并对这些数据进行分页。而不是返回 KpnPaginatorBundle 应该理解的 QueryBuilder
对象,并且只查询需要显示的内容。
我认为您应该在控制器内构建此逻辑,而不是使用 Doctrine Attributes 来实现此目的。尽管如此,这不会影响您的分页功能。
例如,如果您删除
OrderBy
属性,因为您不知道几个月后它的用途,那么您的分页功能现在就会发生变化。但如果你对此感到满意,那就离开吧。