Symfony / Doctrine - QueryException - [Semantical Error] строка 0, столбец 48 рядом с 'pizza-mia': Ошибка: 'pizza' не определена

Я хочу сделать этот запрос в SQLite с использованием DQL

//// src/Repository/PostRepository.php
public function hasPreviousPost($id,$slug): array
{

    $em = $this->getEntityManager();

    $query = $em->createQuery('SELECT p FROM App\Entity\Post p WHERE p.id < '.$id.' AND p.slug = '.$slug);
    $posts = $query->getResult();


    return $posts;
}

И я вызываю эту функцию из PostController вот так

//// src/Controller/PostController.php
        $posts = $this->getDoctrine()->getRepository(Post::class)->findAll();

        foreach ($posts as $post){

        $hasPreviousPost = $this->getDoctrine()->getRepository(Post::class)->hasPreviousPost($post->id(),$post->Slug());
        }

Но когда я запускаю код, я получаю эту ошибку «[Семантическая ошибка], строка 0, столбец 48 рядом с 'pizza-mia': Ошибка: 'пицца' не определена».

pizza-mia - это то, что содержит $ slug, строка.

Это моя сущность Post.

    <?php

namespace App\Entity;

use Doctrine\ORM\Mapping as ORM;

$countPosts = 0;

/**
 * @ORM\Entity(repositoryClass = "App\Repository\PostRepository")
 * @ORM\Table(name = "post")
 */
class Post
{

/**
 * @ORM\Column(type = "integer")
 * @ORM\Column(unique=true)
 */
private $id;

/**
 * @ORM\Id
 * @ORM\Column(type = "text")
 * @ORM\Column(unique=true)
 */
private $postId;

/**
 * @ORM\Column(type = "text")
 */
private $slug;

/**
 * @ORM\Column(type = "text")
 */
private $message;

/**
 * @ORM\Column(type = "boolean",nullable=true)
 */
private $isScheduled;

/**
 * @ORM\Column(type = "integer")
 */
private $scheduledPublishTime;


function __construct($postId,$slug,$message)
{
    global $countPosts;
    $countPosts++;
    $this->postId=$postId;
    $this->id=$countPosts;
    $this->slug=$slug;
    $this->message=$message;
    $this->isScheduled=false;
    $this->scheduledPublishTime=0;
}


public function PostId(): ?string
{
    return $this->postId;
}

public function id(): ?int
{
    return $this->id;
}


public function Slug(): ?string
{
    return $this->slug;
}


public function Message(): ?string
{
    return $this->message;
}


public function IsScheduled(): ?bool
{
    return $this->isScheduled;
}

public function changeIsScheduled(?bool $isScheduled): self
{
    $this->isScheduled = $isScheduled;

    return $this;
}

public function ScheduledPublishTime(): ?int
{
    return $this->scheduledPublishTime;
}

public function changeScheduledPublishTime(int $scheduledPublishTime): self
{
    $this->scheduledPublishTime = $scheduledPublishTime;

    return $this;
}
}

Любая помощь будет оценена по достоинству.

не могли бы вы показать определение сущности вашего класса Post? почему post :: class не начинается с заглавной буквы в вашем примере кода?

LBA 25.07.2018 13:13

это была опечатка, прошу прощения. Я только что добавил класс сущности Post

Eleni Ioakim 25.07.2018 13:20
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Symfony Station Communiqué - 17 февраля 2023 г
Symfony Station Communiqué - 17 февраля 2023 г
Это коммюнике первоначально появилось на Symfony Station , вашем источнике передовых новостей Symfony, PHP и кибербезопасности.
Управление ответами api для исключений на Symfony с помощью KernelEvents
Управление ответами api для исключений на Symfony с помощью KernelEvents
Много раз при создании api нам нужно возвращать клиентам разные ответы в зависимости от возникшего исключения.
1
2
2 481
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуйте так.

$query = $em->createQuery('SELECT p FROM App\Entity\Post p WHERE p.id < :id AND p.slug = :slug');
$query->setParameter('id', $id);
$query->setParameter('slug', $slug);

:id и :slug обозначают именованный параметр

Мое сильное предположение состоит в том, что вам просто не хватает символа '', чтобы ваш $ slug был определен как строка в вашем запросе. Но использование параметров, подобных приведенным выше, также делает его более читабельным.

Найдите объяснение именованных или пронумерованных параметров в документация

Это дает мне эту ошибку «Неверный формат параметра,? Задан, но ожидается: <имя> или? <Число>». Я пытался добавить '' к $ slug, но это тоже не сработало

Eleni Ioakim 25.07.2018 13:35

обновленный ответ - какую версию Doctrine вы используете?

LBA 25.07.2018 13:38

Пользуюсь последней версией, 2.6.2

Eleni Ioakim 25.07.2018 13:42

Другие вопросы по теме