加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

php – 可以使用SQL函数的结果作为Doctrine中的一个字段吗?

发布时间:2020-12-13 13:15:08 所属栏目:PHP教程 来源:网络整理
导读:假设我有产品实体和附加到产品的审查实体.是否可以根据SQL查询返回的某些结果将字段附加到Product实体?喜欢将等于COUNT(Reviews.ID)的ReviewsCount字段作为ReviewsCount. 我知道可以这样做的功能 public function getReviewsCount() { return count($this-R
假设我有产品实体和附加到产品的审查实体.是否可以根据SQL查询返回的某些结果将字段附加到Product实体?喜欢将等于COUNT(Reviews.ID)的ReviewsCount字段作为ReviewsCount.

我知道可以这样做的功能

public function getReviewsCount() {
    return count($this->Reviews);
}

但是我想使用SQL来最大限度地减少数据库查询的数量并提高性能,因为通常我可能不需要加载数百条评论,但仍需要知道该数字.我认为运行SQL的COUNT将比通过100个产品快得多,并为每个产品计算100个评论.而且,这只是一个例子,在实践中我需要更复杂的功能,我认为MySQL会处理得更快.如我错了请纠正我.

您可以映射一个 single column result to an entity field – 查看 native queries和ResultSetMapping来实现这一点.作为一个简单的例子:
use DoctrineORMQueryResultSetMapping;

$sql = '
    SELECT p.*,COUNT(r.id)
    FROM products p
    LEFT JOIN reviews r ON p.id = r.product_id
';

$rsm = new ResultSetMapping;
$rsm->addEntityResult('AppBundleEntityProduct','p');
$rsm->addFieldResult('p','COUNT(id)','reviewsCount');

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

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

/**
 * @ORMColumn(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.

您还可以使用ResultSetMappingBuilder作为开始使用结果集映射.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读