Php 根据原则中的对象类型排序一对多关系 一点背景:

Php 根据原则中的对象类型排序一对多关系 一点背景:,php,doctrine-orm,doctrine,Php,Doctrine Orm,Doctrine,我有一个网站,人们可以在上面下订单。每次有人向订单中添加一个项目时,它都会添加一个OrderItem实体。为了能够定义不同的属性,我将OrderItem设置为一个抽象类,由其他对象(如Subscription或Goodie)扩展 我遇到的问题: 当前,当我显示订单详细信息时,我有一个基于OrderItem ID显示的OrderItem列表,这意味着根据客户向其购物车添加物品的方式,我可能有一个包含以下内容的列表: 订阅 古蒂 古蒂 订阅 我想要什么: 我希望能够按对象类型对我的一对多关系进行

我有一个网站,人们可以在上面下订单。每次有人向订单中添加一个项目时,它都会添加一个OrderItem实体。为了能够定义不同的属性,我将OrderItem设置为一个抽象类,由其他对象(如Subscription或Goodie)扩展

我遇到的问题: 当前,当我显示订单详细信息时,我有一个基于OrderItem ID显示的OrderItem列表,这意味着根据客户向其购物车添加物品的方式,我可能有一个包含以下内容的列表:

  • 订阅
  • 古蒂
  • 古蒂
  • 订阅
我想要什么: 我希望能够按对象类型对我的一对多关系进行排序,以获得如下列表:

  • 古蒂
  • 古蒂
  • 订阅
  • 订阅
到目前为止我所尝试的: 显示您可以通过类似于
@OrderBy({“name”=“ASC”})
的注释进行排序,因此我尝试添加
@OrderBy({“type”=“ASC”})
,但结果是“type”不是可识别的字段,因此无法对其进行排序

我还试图重写存储库“createQueryBuilder”函数,但结果是一团糟

一点帮助代码 这是我在抽象OrderItem上的
DiscriminatorMap
链接到其他类型,也是我尝试在“类型”字段上筛选的原因


在我找到更好的解决方案之前,这是我项目中设置的(感谢@El_Vanja的建议):

我已将Order对象getter更改为在返回OrderItems之前对其进行排序。为此,我使用了以下代码:

public function getOrderItems(): Collection
{
    $orderedOrderItems = $this->orderItems->getIterator();

    $orderedOrderItems->uasort(
        function ($first, $second) {
            if (OrderItemHelper::getOrderBasedOnInstanceName(get_class($first)) === OrderItemHelper::getOrderBasedOnInstanceName(get_class($second))) {
                return 0;
            }
            return (OrderItemHelper::getOrderBasedOnInstanceName(get_class($first)) < OrderItemHelper::getOrderBasedOnInstanceName(get_class($second))) ? -1 : 1;
        }
    );

    return new ArrayCollection(iterator_to_array($orderedOrderItems));
}
公共函数getOrderItems():集合
{
$orderedOrderItems=$this->orderItems->getIterator();
$orderedOrderItems->uasort(
函数($first,$second){
如果(OrderItemHelper::getOrderBasedOnInstanceName(get_类($first))==OrderItemHelper::getOrderBasedOnInstanceName(get_类($second))){
返回0;
}
返回(OrderItemHelper::getOrderBasedOnInstanceName(get_类($first))

OrderItemHelper::getOrderBasedOnInstanceName
只是一个静态方法,可以按特定顺序对OrderItems排序,而不是按名称或任何其他选项排序。

旁注:这是排序/排序,而不是筛选。“…但结果是“type”不是可识别的字段…”-您的类中是否有名为
type
的属性?这是一个专栏吗?@El_Vanja:我根据你的评论更正了我的问题,并添加了更多的描述,解释了为什么我尝试在“类型”字段上进行过滤,因为它是DiscriminatorMapAlso使用的字段。我发现:但最后的反应是3年前,跳转一些更新的数据表,比如尝试在鉴别器列上排序,这有点麻烦。我要说的是,省省麻烦,用PHP订购集合。
public function getOrderItems(): Collection
{
    $orderedOrderItems = $this->orderItems->getIterator();

    $orderedOrderItems->uasort(
        function ($first, $second) {
            if (OrderItemHelper::getOrderBasedOnInstanceName(get_class($first)) === OrderItemHelper::getOrderBasedOnInstanceName(get_class($second))) {
                return 0;
            }
            return (OrderItemHelper::getOrderBasedOnInstanceName(get_class($first)) < OrderItemHelper::getOrderBasedOnInstanceName(get_class($second))) ? -1 : 1;
        }
    );

    return new ArrayCollection(iterator_to_array($orderedOrderItems));
}