У меня есть этот простой контроллер:
<?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 ;
Что я делаю не так?
Спасибо, Марсело.
Я нашел свою проблему... ошибка была уволена, потому что я допустил ошибку внутри своей сущности и файлов сопоставления.
Ниже мой файл сопоставления:
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".
Я сделал ошибку отображения, и генератор объекта доктрины копирует ошибку отображения в объект.
Кстати... Я действительно знаю сейчас, что мне нужно больше внимания при выполнении "копирования и вставки" !!! :)
С наилучшими пожеланиями. Марсело.