Ограничить результаты запроса на основе атрибутов 1 элемента в 1-n ассоциации - PullRequest
3 голосов
/ 28 ноября 2011

У меня есть сущность 'Order' и один-ко-многим связанный объект 'OrderStatus' (поэтому у 1 ордера может быть много статусов).Текущий статус ордера определяется последним статусом, который был добавлен к этому ордеру.

Теперь я хочу создать запрос DQL, который выбирает все ордера с определенным статусом.Однако, поскольку это отношение «один ко многим», я понятия не имею, как этого добиться в DQL.Я знаю только о запросе коллекции состояний в целом.

У кого-нибудь есть идеи, если это вообще возможно, или мне нужно использовать обходной путь?

1 Ответ

3 голосов
/ 28 ноября 2011

У нас была такая же проблема в проекте, над которым мы работаем.Запрос, который вы пытаетесь выполнить, очень похож на этот вопрос , за исключением того, что вы пытаетесь сделать это на DQL, что делает его еще сложнее.Я думаю (но я могу ошибаться), что DQL не разрешает такого рода запросы, и вы можете достичь ожидаемого результата с помощью собственного SQL запроса со всеми вытекающими отсюда предостережениями.

В итоге мы настоятельно рекомендуем вам сделать текущий статус собственностью вашего Order.Это позволяет легко и быстро запрашивать запросы, не требуя объединения.Изменение действительно безболезненно:

class Order
{
    /**
     * @ManyToOne(targetEntity="OrderStatus")
     */
    protected $status;

    /**
     * @OneToMany(targetEntity="OrderStatus")
     */
    protected $statuses;

    public function setStatus($status)
    {
        $orderStatus = new OrderStatus($this, $status);
        $this->statuses->add($orderStatus);
        $this->status = $orderStatus;
    }
}

$status также может быть простым string свойством, если ваш OrderStatus в основном состоит из строки состояния и даты;код станет:

class Order
{
    /**
     * @Column(type="string")
     */
    protected $status;

    // ...

    public function setStatus($status)
    {
        // ...
        $this->status = $status;
    }
}
...