/**
* @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? Или я бы пошел по-другому?
Вы должны написать метод 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’) должны работать.
Как я уже говорил в своих комментариях, вероятно, вы боретесь с проблемой, которая не должна была возникнуть в первую очередь. Тем не менее, имея SUM
значение сопоставляется со свойством является возможно использование учения различными способами: Проверьте совокупные поля документов чтобы выяснить, что решит вашу проблему лучше всего.
На мой взгляд, вы используете сущности как нечто большее, чем они есть: сущности представляют записи в базе данных, Doctrine — это DBAL. Поиск данных с использованием сущностей (или хранилищ) является запрос к базе данных. Вы можете решить эту проблему, добавив пользовательские методы в свой менеджер сущностей или собственный класс репозитория, который будет запрашивать все данные, необходимые для вычисления значения totalCost для всех сущностей, и возвращать только те, которые вам нужны. В качестве альтернативы, используйте соединение из вашей DBAL для запроса идентификаторов, которые вы ищете (например), затем используйте те значения, чтобы добраться до реальных лиц. Или, как я уже говорил, используйте совокупные поля.
Проблемы у вас с findOneByTotalCost
а также findBy
примеры, которые вы показываете, что первый требует, чтобы вы написали метод Называется findOneByTotalCost
сам. Проблема с вашим использованием findBy
просто ваш аргумент искажен: массив должен быть ассоциативным: использовать сопоставленные имена столбцов в качестве ключей, а значения — это то, что вы хотите запросить:
$repo->findBy(
['totalCost' => 400]
);
это то, что вы ищете, а не ['totalCost', 400]
, Что касается самой сущности, вам нужно добавить аннотацию:
Да, судя по вашему использованию @ORM\Entity
аннотации в doc-блоках, это должно сделать это:
/**
* @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
{}
Как всегда: в БД, индексах иметь значение