Doctrine orm 如何按非';DB列是否使用条令?

Doctrine orm 如何按非';DB列是否使用条令?,doctrine-orm,single-table-inheritance,Doctrine Orm,Single Table Inheritance,定义关系时,相关模型上有一个属性(不是DB列),但我想按它排序(在@OrderBy注释中) 我有一个使用扩展的基本模型。该属性基本上是在每个子类中指定的order属性,但不会保存到数据库中 (我不想在DB表中添加order列,因为排序完全取决于鉴别器映射到哪个子类。已经存在唯一的约束,因此每个子类在关系中只能使用一次。) 这是我的代码的一个非常简化的版本 基本实体: 儿童: 相关实体: 是否可以使用order属性对集合关系进行排序?(基于class_name使用类似开关的构造进行排序也是有效的,

定义关系时,相关模型上有一个属性(不是DB列),但我想按它排序(在
@OrderBy
注释中)

我有一个使用扩展的基本模型。该属性基本上是在每个子类中指定的
order
属性,但不会保存到数据库中

(我不想在DB表中添加
order
列,因为排序完全取决于鉴别器映射到哪个子类。已经存在唯一的约束,因此每个子类在关系中只能使用一次。)

这是我的代码的一个非常简化的版本

基本实体: 儿童: 相关实体: 是否可以使用
order
属性对
集合
关系进行排序?(基于
class_name
使用类似
开关的构造进行排序也是有效的,但我也没有找到任何方法来实现这一点,而且维护起来会更困难。)


提前谢谢

以ORM开头的指令告诉我们,您正在引用与表字段有关系的属性。不能对不存在的字段使用ORM指令

您必须在函数中实现这一点,最好是在模型本身(在您的getCollection()函数中)中实现,或者如果您使用的是类似Symfony的框架,请将其放置在该实体的存储库类的函数中。要做到这一点,您必须使用PHP排序函数。SQL/DQL也无法工作,因为该属性与表中的字段不相关。

可能相关:
/**
 * @ORM\Entity
 * @ORM\Table(name="base")
 * @ORM\InheritanceType("SINGLE_TABLE")
 * @ORM\DiscriminatorColumn(name="class_name", type="string")
 *
 * @ORM\DiscriminatorMap({
 *   "Base" = "Models\Base",
 *   "ChildA" = "Models\ChildB",
 *   "ChildB" = "Models\ChildA"
 * })
 **/
class Base 
{
    /** @ORM\Column(type="string") **/
    protected $class_name;

    /**
     * @ORM\ManyToOne(targetEntity="Related", inversedBy="collection")
     **/
    protected $related;

    // this is just a plain ol' property (not in the DB)
    protected $order;

    public function getClassName()
    {
        return $this->class_name;
    }
}
/**
 * @ORM\Entity
 * @ORM\Table(name="child_a")
 **/
class ChildA extends Base
{
    $order = 1;
}

/**
 * @ORM\Entity
 * @ORM\Table(name="child_b")
 **/
class ChildB extends Base
{
    $order = 2;
}
/**
 * @ORM\Entity
 * @ORM\Table(name="related")
 **/
class Related
{
    /**
     * @ORM\OneToMany(targetEntity="Base", mappedBy="related")
     * @ORM\OrderBy({"order"="ASC"})
     **/
    protected $collection;

    public function getCollection()
    {
        $em = App::make('Doctrine\ORM\EntityManagerInterface');

        // map each Base instance to the appropriate child class
        return $this->collection->map(function ($base) use ($em) {
            $class_name = $base->getClassName();
            return $em->find($class_name, $base->getId());
        });
    }
}