基于1-n关联中的1项的属性限制查询结果

时间:2011-11-28 09:10:51

标签: doctrine-orm dql

我有一个实体'Order'和一对多关联实体'OrderStatus'(所以1个订单可以有很多状态)。订单的当前状态由添加到该订单的最后一个状态定义。

现在我想创建一个DQL查询,它选择具有特定状态的所有订单。但是,因为这是一对多的关系,所以我不知道如何在DQL中实现这一点。我只知道查询整个状态的集合。

是否有人知道这是否可能,或者我是否必须使用解决方法?

1 个答案:

答案 0 :(得分:3)

在我们正在开展的项目中,我们遇到了同样的问题。您尝试执行的查询与this question非常相似,只是您尝试在DQL中执行此操作,这使得它更难。我认为(但我可能错了)DQL不允许这种查询,并且您可以通过native 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;
    }
}