如何在条令2中指定1:1关系的几个连接条件


How to specify several join conditions for 1:1 relationship in Doctrine 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

似乎没有任何解决方案可以让Doctrine自动神奇地完成。

由于@ficuscr已经为您提供了一个查询解决方案,因此只有一件事需要处理——检查您的附加条件,并在成功时在getter中返回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(也称为准则)来筛选由映射创建的集合:

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

您可以使用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子句,因为我认为没有必要显式指定联接的ON字段,除非它们不是"标准"字段(每个实体的id)

还注意到对CURRENT_TIMESTAMP()的调用,该调用转换为MySQL的NOW()。在这里查看其他非常有用的聚合函数和表达式的列表