Понимание проблемы Doctrine 2 ORM Query Builder в Symfony 4 - PullRequest
0 голосов
/ 27 мая 2019

Я надеюсь, что есть несколько полезных и предпочитающих немецких экспертов 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.');  
    }
 [...]

Я уже пытался реализовать это и многое другое (безрезультатно): Количество строк в Doctrine QueryBuilder

Поскольку я плохо говорю по-английски, я очень надеюсь, что вы меня понимаете ...

Ответы [ 2 ]

0 голосов
/ 27 мая 2019

, поэтому получение значения с помощью $ _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

0 голосов
/ 27 мая 2019

Один простой способ сделать это будет примерно так (при условии, что у вас есть сущность «Вопрос» - и что определенные в ней поля совпадают с именами столбцов из вашего необработанного запроса).

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