为了账号安全,请及时绑定邮箱和手机立即绑定

了解 Symfony 4 中的问题 Doctrine 2 ORM Query Builder

了解 Symfony 4 中的问题 Doctrine 2 ORM Query Builder

PHP
暮色呼如 2021-07-06 13:06:37
我希望有一些有用的并且更喜欢德国 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.');      } [...]由于我的英语说得不好,我非常希望你能理解我……
查看完整描述

2 回答

?
ITMISS

TA贡献1871条经验 获得超8个赞

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


查看完整回答
反对 回复 2021-07-09
?
料青山看我应如是

TA贡献1772条经验 获得超8个赞

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


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


查看完整回答
反对 回复 2021-07-09
  • 2 回答
  • 0 关注
  • 193 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信