![](/img/trans.png)
[英]How do I configure a Doctrine2 entity which extends PersistentObject within Symfony2 project?
[英]How do I search by properties of entity which do not have @Column anotation in Doctrine2?
/**
* @ORM\Entity
*/
class Order extends BaseEntity
{
// this is trait for @Id
use Identifier;
/**
* @ORM\Column(type="integer")
*/
protected $costPerUnit;
/**
* @ORM\Column(type="integer")
*/
protected $numberOfUnits;
// i want to search by this property
protected $totalCost;
public function getTotalCost()
{
return $this->numberOfUnits * $this->costPerUnit;
}
}
我有一个这样的实体,例如
$orderRepository->findOneByTotalCost('999')
$orderRepository->findBy(['totalCost' => '400']);
在Doctrine2中这可能吗? 还是我会另辟?径?
就像我在评论中说的那样,很可能您正在努力解决本来不应该发生的问题。 不过,有SUM
映射到一个属性值可能使用原则,以各种不同的方式: 检查合计字段的文档 ,以找出最能解决你的问题。
在我看来,您所使用的实体要比它们实际使用的实体多:实体表示数据库中的记录,Doctrine是DBAL。 使用实体(或存储库)搜索数据正在查询数据库。 您可以通过将自定义方法添加到实体管理器或自定义存储库类来解决问题,该类将查询计算所有实体的totalCost值所需的所有数据,并仅返回所需的数据。 或者,使用来自DBAL的连接来查询您想要的ID(例如),然后使用这些值获取实际的实体。 或者,就像我之前说过的:使用聚合字段。
您显示的findOneByTotalCost
和findBy
示例存在的问题是,第一个示例需要您自己编写一个称为 findOneByTotalCost
的方法。 使用findBy
的问题很简单,就是您的参数格式错误:数组应该是关联的:将映射的列名称用作键,并且值是您要查询的内容:
$repo->findBy(
['totalCost' => 400]
);
是您要寻找的内容,而不是['totalCost', 400]
。 至于实体本身,您需要添加一个注释:
是的,通过在文档块中使用@ORM\\Entity
批注来判断,应该这样做:
/**
* @ORM\Column(type="string", length=255)
*/
protected $regioun = 'Spain';
更新表,您将能够:
$entities = $repo->findBy(
['region' => 'Spain']
);
别忘了这段代码代表数据库中的一个表:您可以搜索任何字段,但是可以使用索引,可以通过在类定义的顶部添加批注来实现:
/**
* @ORM\Table(name="tblname", indexes={
* @ORM\Index(name="region", columns={"region"})
* })
*/
class Foo
{}
一如既往:在数据库中,索引很重要
您应该在实体存储库上编写方法findOneByTotalCost,例如:
public function findOneByTotalCost ($queryParams){
$query = 'select o
from <yourEntity> o
where o.numberOfUnits * o.costPerUnit = :myParam';
$dql = $this->getEntityManager()->createQuery($query);
$dql->setParameter('myParam', $queryParams);
return $dql ->execute();
}
他们,$ orderRepository-> findOneByTotalCost('999')应该可以工作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.