猿问

了解 Symfony 4 中的问题 Doctrine 2 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.');  

    }

 [...]


由于我的英语说得不好,我非常希望你能理解我……


暮色呼如
浏览 194回答 2
2回答

ITMISS

因此,不建议使用 $_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 中完成的

料青山看我应如是

一种简单的方法是这样的(假设您有一个“问题”实体 - 并且在那里定义的字段与原始查询中的列名匹配)。$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();
随时随地看视频慕课网APP
我要回答