在PHP脚本用sql添加字段,php – 可以使用SQL函数的结果作为Doctrine中的一个字段吗?...

您可以映射一个

single column result to an entity field – 查看

native queries和ResultSetMapping来实现这一点.作为一个简单的例子:

use Doctrine\ORM\Query\ResultSetMapping;

$sql = '

SELECT p.*,COUNT(r.id)

FROM products p

LEFT JOIN reviews r ON p.id = r.product_id

';

$rsm = new ResultSetMapping;

$rsm->addEntityResult('AppBundle\Entity\Product','p');

$rsm->addFieldResult('p','COUNT(id)','reviewsCount');

$query = $this->getEntityManager()->createNativeQuery($sql,$rsm);

$results = $query->getResult();

然后在您的产品实体中,您将有一个$reviewsCount字段,计数将被映射到该字段.请注意,只有在Doctrine肉类数据中定义了一个列,这样才可以:

/**

* @ORM\Column(type="integer")

*/

private $reviewsCount;

public function getReviewsCount()

{

return $this->reviewsCount;

}

这是Aggregate Fields学说文件的建议.问题在于,您本质上使Doctrine认为您在数据库中有另一列,名为reviews_count,这是您不想要的.所以,这仍然可以在没有实际添加该列的情况下工作,但是如果您运行了一个原则:schema:update将为您添加该列.不幸的是,Doctrine真的不允许虚拟属性,所以另一个解决方案是编写自己的定制hydrator,或者可能订阅loadClassMetadata事件,并在您的特定实体(或实体)加载之后自己手动添加映射.

请注意,如果您执行类似COUNT(r.id)AS reviewsCount的操作,那么您不能再在addFieldResult()函数中使用COUNT(id),并且必须使用该第二个参数的别名reviewsCount.

我的实际建议是手动执行,而不是通过所有额外的东西.基本上创建一个常规查询,将您的实体和标量结果返回到数组中,然后将标量结果设置为实体上相应的未映射字段,并返回实体.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值