有了这个实体:
/**
* @ORM\Table(name="shop_payment_details")
* @ORM\Entity(repositoryClass="Acme\ShopBundle\Entity\PaymentRepository")
*/
class Payment extends ArrayObject
{
/**
* @ORM\Column(name="id", type="integer")
* @ORM\Id
* @ORM\GeneratedValue(strategy="IDENTITY")
*
* @var integer $id
*/
protected $id;
/**
* @ORM\ManyToOne(targetEntity="Acme\UserBundle\Entity\User")
* @ORM\JoinColumn(name="user_id", referencedColumnName="id")
**/
protected $user;
/**
* @ORM\ManyToOne(targetEntity="Acme\ShopBundle\Entity\Item")
* @ORM\JoinColumn(name="item_id", referencedColumnName="id")
**/
protected $item;
/**
* @ORM\Column(name="date", type="datetime", nullable=true)
*/
protected $date;
/**
* @ORM\Column(name="amount", type="float", nullable=true)
*/
protected $amount;
我需要在他选择的两个日期之间提交销售表。 该表必须包含两个日期之间的所有日期以及商店中对象的参考代码。
我怎样才能得到它?可以只使用Doctrine来实现,或者我必须使用PHP来构建该表吗?
答案 0 :(得分:1)
有可能,您需要的是Doctrine-ORM提供的orX()
函数
您需要使用函数exp()
创建两个表达式,然后您可以将两个表达式放在orX()
语句中以获得所需的结果。
对于您需要定义的表达式,您需要功能
gt()/lt()
- 大于/小于
这样您就可以比较两个日期
如需进一步参考,请查看以下链接:
https://doctrine-orm.readthedocs.org/en/latest/reference/query-builder.html#high-level-api-methods
<强> PS:强> 对于可读性和逻辑,在将表达式插入查询之前创建表达式应该更容易:
$exp1 = $qb->expr()->gt('..', '?value');
$exp2 = $qb->expr()->gt('..', '?value2'),
...
$qb->where($qb->expr()->orX($exp1, $exp2));
请注意orX
可以聚合无限数量的表达式
答案 1 :(得分:0)
创建自定义DQL(在我建议的存储库中)以检索所有付款,其中payment.date =&gt; yourSmallerUserDate和payment.date&lt; = yourBiggerUserDate。
结果将是您的两个日期之间的所有付款。
在您的逻辑中,您构建一个表,在您的两个日期之间每天有一行。只要您的结果中的日期与您的行日期相匹配,请将其添加到您的输出中。