Intereting Posts
Хранение массивов в MySQL? Ошибка переименования PHP для имени файла с помощью строки utf-8 arabic charset возможно ли использовать регулярное выражение для поиска внутри массива, используя php Как отобразить правильный ответ в разных цветах, чем остальные? php explode: разделите строку на слова, используя пробел разделитель Запустить php-код в командной строке Передать значение нажатой кнопки с одной страницы на другую. Поле ввода API календаря Google, хранящий код или токен доступа Как выполнить второй запрос PDO mysql в цикле while из другого запроса? Как перевести строки в JS CodeIgniter вставляет дважды одну и ту же запись. В некоторых случаях нужно проверить, был ли SQL-запрос успешным Ошибка PHP if / while и / img php: SQLSTATE Соединение не может быть выполнено, потому что целевая машина активно отказалась от него Динамически вытягивать данные из Dynamics CRM Online

Как указать несколько условий соединения для отношений 1: 1 в Доктрине 2

Документация гласит:

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); } }