[英]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.