了解问题 Doctrine 2 ORM Query Builder in Symfony 4

Understanding problem Doctrine 2 ORM Query Builder in Symfony 4

我希望有一些有用的并且更喜欢德国 Symfony 专家。多年来,我一直在使用 PHP,现在我尝试使用一个框架。我现在选择 Symfony 是因为我最喜欢它的组件。 QueryBuilder 和我站在 war 脚下 - 我只是不明白。到目前为止,存储值工作得很好,但我怀疑我是否在框架的意义上这样做。我真的很无奈。目前我通过追逐原始格式的所有内容来管理它,但我对此并不满意。

如何使用 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

因为我的英语不好,所以我很希望你能理解我...

一个简单的方法就是这样(假设您有一个 "Question" 实体 - 并且那里定义的字段与原始查询中的列名匹配)。

$em = $this->getDoctrine()->getManager();
$userQuestions = $em->getRepository(Question:class)->findAll(['questToID' => $_POST['u'], 'questFrom ' => $this->getUser()->getId()]);

$total = count($userQuestion);

或者,如果您更喜欢从查询中获取计数而不是获取所有匹配的对象并对它们进行计数,您可以像这样编写查询构建器部分(在这种格式中,这意味着要写在您的与您的原始查询一样的控制器 - 通常,"correct" 位置将是 QuestionRepository.php class,这将在控制器中被调用):

$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();

因此不推荐使用 $_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 中完成的