Как мне искать по свойствам сущности, у которых нет аннотации @Column в 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? Или я бы пошел по-другому?

0

Решение

Вы должны написать метод 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’) должны работать.

1

Другие решения

Как я уже говорил в своих комментариях, вероятно, вы боретесь с проблемой, которая не должна была возникнуть в первую очередь. Тем не менее, имея 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
{}

Как всегда: в БД, индексах иметь значение

2

По вопросам рекламы [email protected]