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