Ошибка DQL с доктриной 2

0

У меня есть этот простой контроллер:

<?php if (!defined('BASEPATH')) exit('No direct script access allowed');
class Home extends CI_Controller
{
    public function __construct()
    {
        parent::__construct();
    }

    public function index()
    {
        if (!is_null($this->doctrine->em))
        {
            $em = $this->doctrine->em;

            $categorias = $em->getRepository('Entities\Categoria')->findBy([], ['categoria' => 'ASC']); (*)
            $data['categorias'] = $categorias;

            $dql = "SELECT r FROM Entities\Receita r"; 
            $query = $em->createQuery($dql); 
            $query->setMaxResults(4);
            $receitas = $query->getResult(); (**)

            $data2['chamadas'] = $receitas;

            //Defino aqui o indice do menu que ficará ativo
            $this->session->set_userdata('menu_active', 0);

            $this->load->view('html_header'); 
            $this->load->view('menu_categorias', $data);
            $this->load->view('conteudo', $data2);
            $this->load->view('html_footer');

        }
    }
}

В строке (*) работает нормально. Но в строке (**), я получаю ошибку ниже.

(!) Неустранимая ошибка: исключить исключение "PDOException" с сообщением "SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец" r0_.slug_categoria "в" списке полей "в C:\wamp\www\ControleReceitas_DoctrineORM\application\libraries\Doctrine\DBAL\Driver\AbstractMySQLDriver.php в строке 71

PDOException: SQLSTATE [42S22]: столбец не найден: 1054 Неизвестный столбец "r0_.slug_categoria" в "списке полей" в C:\wamp\www\ControleReceitas_DoctrineORM\application\libraries\Doctrine\DBAL\Driver\PDOConnection.php в строке 104

Это простой запрос. Я хочу получить 4 записи из вышеуказанного запроса, но я получаю эту ошибку. Я действительно не знаю, что случилось. Это предупреждение о поле r0_.slug_categoria, но это поле находится в другой таблице.

Мое намерение состоит в том, чтобы получить 4 случайные разные записи в каждой загрузке страницы. Я знаю, что мой запрос здесь не так. Но я не могу сделать этого простого, это работает... Итак, прежде всего, мне нужно понять, что происходит не так, чтобы быть в состоянии идти вперед...

Ниже представлена моя структура таблиц.

CREATE TABLE IF NOT EXISTS 'categorias' (
  'id_categoria' int(10) unsigned NOT NULL AUTO_INCREMENT,
  'categoria' varchar(45) NOT NULL,
  'slug_categoria' varchar(255) NOT NULL,
  PRIMARY KEY ('id_categoria')
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=29 ;

CREATE TABLE IF NOT EXISTS 'receitas' (
  'id_receita' int(10) unsigned NOT NULL AUTO_INCREMENT,
  'receita' varchar(255) NOT NULL,
  'slug_receita' varchar(255) NOT NULL,
  'texto' text NOT NULL,
  'categoria' int(10) unsigned NOT NULL,
  'foto' varchar(45) DEFAULT NULL,
  'adicionada_quando' timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY ('id_receita'),
  KEY 'FK_receita_categoria' ('categoria')
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

Что я делаю не так?

Спасибо, Марсело.

Теги:
doctrine2

1 ответ

0

Я нашел свою проблему... ошибка была уволена, потому что я допустил ошибку внутри своей сущности и файлов сопоставления.

Ниже мой файл сопоставления:

Entities\Receita:
  type: entity
  table: receitas
  fields:
    idReceita:
      type: integer
      id: true
      generator:
        strategy: IDENTITY
      column: id_receita
    receita:
      type: string
      length: 45
      nullable: false
    slugReceita:
      type: string
      length: 255
      nullable: false
      column: slug_receita (*)
    texto:
      type: text
      nullable: false
    foto:
      type: string
      length: 45
      nullable: true
    adicionadaQuando:
      type: datetimetz
      columnDefinition: TIMESTAMP DEFAULT CURRENT_TIMESTAMP
      nullable: false
      column: adicionada_quando
  manyToOne:
      categoria:
        targetEntity: Categoria
        joinColumn:
          name: categoria
          referencedColumnName: id_categoria

Ошибка была в строке (*), где была slug_categoria, а правильная - slug_receita.

Вторая ошибка была обнаружена у моего лица:

class Receita
{
    /**
     * @var integer
     *
     * @ORM\Column(name="id_receita", type="integer")
     * @ORM\Id
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    private $idReceita;

    /**
     * @var string
     *
     * @ORM\Column(name="receita", type="string", length=45, nullable=false)
     */
    private $receita;

    /**
     * @var string
     *
     * @ORM\Column(name="slug_receita", type="string", length=255, nullable=false) (*)
     */
    private $slugReceita;

В строке (*) это было имя = "slug_categoria", а правильным является name = "slug_receita".

Я сделал ошибку отображения, и генератор объекта доктрины копирует ошибку отображения в объект.

Кстати... Я действительно знаю сейчас, что мне нужно больше внимания при выполнении "копирования и вставки" !!! :)

С наилучшими пожеланиями. Марсело.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню