gpt4 book ai didi

php - 带有子查询的 Doctrine Update 查询

转载 作者:行者123 更新时间:2023-12-01 00:30:47 25 4
gpt4 key购买 nike

我正在尝试使用 doctrine dql 执行类似于以下查询的查询:

Doctrine_Query::create()
->update('Table a')
->set('a.amount',
'(SELECT sum(b.amount) FROM Table b WHERE b.client_id = a.id AND b.regular = ? AND b.finished = ?)',
array(false, false))
->execute();

但它会引发一个 Doctrine_Query_Exception 并显示消息:“未知组件别名 b”

在'set'子句中使用子查询有限制吗,你能帮我一些忙吗?

提前致谢。

最佳答案

多年后但可能有所帮助。

是的]

如果您需要/想要/必须,您可以使用Querybuilder 来执行具有子选择语句的更新查询,而不是直接使用底层连接层.
这里的想法是两次使用 QueryBuilder。

  • 构建一个 select 语句来计算新值。
  • 构建实际的更新查询以提交给数据库,您将在其中注入(inject)前一个选择的 DQL,正如您所期望的那样,以便发出单个数据库请求。

示例]

给定一个用户可以出售元素的应用程序。每笔交易都涉及买方和卖方。交易结束后,买卖双方可以对对方的交易进行情况进行评论。
您可能需要一个User 表、一个Review 表和一个Transaction 表。
User 表包含一个名为rating 的字段,它将保存用户的平均评分。 Review 表存储一个交易 ID、作者 ID(提交评论的人)、一个值(从 0 到 5)。最后,交易包含供买卖双方引用。

现在假设您想在对方提交评论后更新用户的平均评分。更新查询将计算用户的平均评分并将结果作为 User.rating 属性的值。
我在 Doctrine 2.5Symfony3 中使用了以下代码片段。由于这项工作是关于用户的,因此我有必要在 AppBundle\Entity\UserRepository.php 存储库中创建一个名为 updateRating(User $user) 的新公共(public)函数。 p>

/**
* Update the average rating for a user
* @param User $user The user entity object target
*/
public function updateRating( User $user )
{
// Compute Subrequest. The reference table being Transaction, we get its repository first.
$transactionRepo = $this->_em->getRepository('AppBundle:Transaction');
$tqb = $postRepo->createQueryBuilder('t');
#1 Computing select
$select = $tqb->select('SUM(r.value)/count(r.value)')
// My Review table as no association declared inside annotation (because I do not need it elsewhere)
// So I need to specify the glue part in order join the two tables
->leftJoin('AppBundle:Review','r', Expr\Join::WITH, 'r.post = p.id AND r.author <> :author')
// In case you have an association declared inside the Transaction entity schema, simply replace the above leftJoin with something like
// ->leftJoin(t.reviews, 'r')
// Specify index first (Transaction has been declared as terminated)
->where( $tqb->expr()->eq('t.ended', ':ended') )
// The user can be seller or buyer
->andWhere( $tqb->expr()->orX(
$tqb->expr()->eq('t.seller', ':author'),
$tqb->expr()->eq('t.buyer', ':author')
));
#2 The actual update query, containing the above sub-request
$update = $this->createQueryBuilder('u')
// We want to update a row
->update()
// Setting the new value using the above sub-request
->set('u.rating', '('. $select->getQuery()->getDQL() .')')
// should apply to the user we want
->where('u.id = :author')
// Set parameters for both the main & sub queries
->setParameters([ 'ended' => 1, 'author' => $user->getId() ]);
// Get the update success status
return $update->getQuery()->getSingleScalarResult();
}

现在从 Controller

            // … Update User's rating
$em->getRepository('AppBundle:User')->updateRating($member);
// …

关于php - 带有子查询的 Doctrine Update 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6779623/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com