我希望有一些乐于助人且更喜欢德国Symfony的专家。多年来,我一直在使用PHP,现在尝试使用框架。我之所以选择Symfony,是因为我最喜欢这些组件。我和QueryBuilder站在一起-我只是不明白。到目前为止,存储值的工作情况非常好,尽管我怀疑我是在框架意义上这样做的。我真的很无奈。目前,我通过追踪原始格式来管理所有内容,但我对此并不满意。
如何使用Doctrine实现以下功能?
use App\Entity\Questions;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\Routing\Annotation\Route;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Doctrine\ORM\EntityManager;
class QuestionsController extends AbstractController
{
/**
* @Route("/addquestion", methods={"POST","HEAD"})
*/
public function addQuestion()
{
$entityManager = $this->getDoctrine()->getManager();
$RAW_QUERY = 'SELECT COUNT(*) AS c FROM questions WHERE questToID = '.$_POST['u'].' AND questFrom = '.$this->getUser()->getId().';';
$statement = $entityManager->getConnection()->prepare($RAW_QUERY);
$statement->execute();
$total = $statement->fetchAll();
if($total[0]['c'] >= 3)
{
return new Response('error|Du kannst der selben Person maximal drei Fragen stellen.');
}
[...]
我已经尝试实现此功能以及其他许多功能(无济于事): Count Rows in Doctrine QueryBuilder
由于我的英语说得不好,所以我非常希望您能理解我的意思……
答案 0 :(得分:0)
一种简单的实现方式是这样的(假设您有一个“问题”实体-并且在那里定义的字段与原始查询中的列名匹配)。
$em = $this->getDoctrine()->getManager();
$userQuestions = $em->getRepository(Question:class)->findAll(['questToID' => $_POST['u'], 'questFrom ' => $this->getUser()->getId()]);
$total = count($userQuestion);
或者,如果您希望仅从查询中获取计数,而不是获取所有匹配的对象并对其进行计数,则可以将查询生成器部分编写如下(在这种格式下,应将其写入控制器中)您可以使用原始查询-通常,“正确”的位置将是QuestionRepository.php类,在该位置将在控制器中被调用):
$em = $this->getDoctrine()->getManager();
$qb = $em->createQueryBuilder('q');
$qb->select('count(q)');
$qb->andWhere('q.questToID = :questToID');
$qb->andWhere('q.questFrom = :questFrom');
$qb->setParameter('questToID', $_POST['u']);
$qb->setParameter('questFrom ', $this->getUser()->getId());
$total = $qb->getQuery()->getSingleScalarResult();
答案 1 :(得分:0)
因此,不建议她使用$ _POST ['u']获取值,您既可以通过路由传递值,也可以将其检索为函数的参数:
/**
* @Route("/addquestion/{u}", methods={"POST","HEAD"})
*/
public function addQuestion($u)
或者您可以从自己的请求中获取它:
/**
* @Route("/addquestion", methods={"POST","HEAD"})
*/
public function addQuestion(Request $request)
如果您想使用查询生成器,则最佳实践是为您的实体创建一个存储库,并在其中进行查询:
namespace App\Repository;
use App\Entity\Questions;
use Doctrine\ORM\EntityRepository;
class QuestionsRepository extends EntityRepository
{
public function findUserQuestions($user, $u)
{
$queryBuilder = $this->createQueryBuilder('c')
->where('c.questToID = :questToID')
->andWhere('c.questFrom = :questFrom')
->setParameters(['questToID'=>$u,'questFrom'=>$user]);
return $queryBuilder->getQuery()->getResult();
}
在您的控制器中,您可以获得结果:
$userQuestions = $this->getDoctrine()->getRepository(Questions::class)->findUserQuestions($this->getUser(), $u);
count($userQuestions);
我希望这对您有用,并向您解释一下它在symfony中的作用