了解Symfony 4中的问题学说2 ORM查询生成器

时间:2019-05-27 05:59:22

标签: php symfony doctrine-orm query-builder

我希望有一些乐于助人且更喜欢德国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

由于我的英语说得不好,所以我非常希望您能理解我的意思……

2 个答案:

答案 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中的作用