Документация гласит:
class Cart { // ... /** * @OneToOne(targetEntity="Customer", inversedBy="cart") * @JoinColumn(name="customer_id", referencedColumnName="id") */ private $customer; // ... }
Эта аннотация представляет собой такой sql:
JOIN Customer c ON c.id = cart.customer_id
И проблема в том, что мне нужно добавить туда дополнительное сравнение, например:
JOIN Customer c ON c.id = cart.customer_id AND c.anotherField = <constant>
Любые решения для этого?
UPD :
реальное дополнительное условие, которое мне нужно сейчас, это <const> BETWEEN c.f1 AND c.f2
вы можете использовать ключевое слово WITH
чтобы указать дополнительные условия соединения, как вы можете видеть в некоторых примерах .
я думаю, это должно заставить вас идти:
SELECT l, c FROM location INNER JOIN Customer c WITH CURRENT_TIMESTAMP() BETWEEN c.f1 AND c.f2 WHERE CURRENT_TIMESTAMP() BETWEEN l.f1 AND l.f2
я удалил предложение ON
, потому что я думаю, что нет необходимости явно указывать поля включения соединения, если они не являются «стандартными» (id каждого объекта)
также обратите внимание на вызов CURRENT_TIMESTAMP()
который переводится в NOW()
MySQL. ознакомьтесь со списком других полезных полезных функций и выражений здесь.
Кажется, не существует какого-либо решения вашей проблемы, которое Doctrine могла бы делать автоматически.
Поскольку @ficuscr уже дал вам решение для запросов, есть еще одна вещь, которую нужно обработать – проверьте свои дополнительные критерии и верните экземпляр Customer в своем получателе при успешном завершении и NULL при несоблюдении дополнительных критериев.
class Cart { const VALUE = '<some_constant_value>'; /** * @OneToOne(targetEntity="Customer", inversedBy="cart") * @JoinColumn(name="customer_id", referencedColumnName="id") */ private $customer; // ... /** * @return Customer|null */ public function getCustomer() { if ($this->customer->getField1() <= self::VALUE && $this->customer->getField2() >= self::VALUE ) { return $this->customer; } return null; } }
Если это было отношение «один-ко-многим», для фильтрации коллекции, созданной сопоставлениями, можно было бы использовать API фильтрации Collection (aka Criteria):
use Doctrine\Common\Collections\Criteria; class Cart { const VALUE = '<some_constant_value>'; /** * @OneToMany(targetEntity="Customer", mappedBy="cart") */ private $customers; // ... /** * @return Customer[]|ArrayCollection */ public function getCustomers() { $expr = Criteria::expr(); $criteria = Criteria::create() ->where($expr->andX( $expr->lte('field1', self::VALUE), $expr->gte('field2', self::VALUE) )); return $this->patientProblems->matching($criteria); } }
иuse Doctrine\Common\Collections\Criteria; class Cart { const VALUE = '<some_constant_value>'; /** * @OneToMany(targetEntity="Customer", mappedBy="cart") */ private $customers; // ... /** * @return Customer[]|ArrayCollection */ public function getCustomers() { $expr = Criteria::expr(); $criteria = Criteria::create() ->where($expr->andX( $expr->lte('field1', self::VALUE), $expr->gte('field2', self::VALUE) )); return $this->patientProblems->matching($criteria); } }