文档状态:
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()
。在这里查看其他非常有用的聚合函数和表达式的列表