Doctrine 2: Нет столбца с именем '$ columnName' в таблице '$ table'

Когда я это сделаю:

vendor/bin/doctrine-module orm:schema-tool:update

Doctrine 2.4 дает мне эту ошибку:

[Doctrine\DBAL\Schema\SchemaException]
There is no column with name 'resource_id' on table 'role_resource'.

В моей фактической схеме базы данных MySQL есть столбец и таблица, как видно из выполнения этой команды (без ошибок):

mysql> select resource_id from role_resource;
Empty set (0.00 sec)

Таким образом, ошибка должна быть где-то в представлении Doctrine схемы. Я сделал var_dump() объекта $this, и вот что я получаю (частично):

object(Doctrine\DBAL\Schema\Table)#546 (10) {
    ["_name"   :protected] => string(13) "role_resource"
    ["_columns":protected] => array(0) { }

Обратите внимание, что действительно, ключ _columns не содержит столбцов, как Doctrine проверяет имена столбцов.

В моем случае дамп частичного следа выглядит следующим образом:

Чтение других сообщений с аналогичной проблемой, похоже, предполагает, что у меня может быть ошибка в случае столбца (верхняя и нижняя). Хотя возможно, что я что-то пропустил, но, глядя на мою фактическую схему в базе данных и аннотации в моем коде, кажется, предлагает совпадение (все строчные буквы). Аналогично, Код Doctrine2 включает проверки на наличие таких ошибок обсадной колонны. Поэтому я исключаю возможность обхода обсадной колонны.

Другое сообщение, которое я видел, указывает на то, что в моих аннотациях может быть ошибка, то есть неправильное название, синтаксис или размещение id. Я не знаю, я проверил его, и это кажется прекрасным. Вот что я имею:

class Role implements HierarchicalRoleInterface
{
/**
 * @var \Doctrine\Common\Collections\Collection
 * @ORM\ManyToMany(targetEntity="ModuleName\Entity\Resource")
 * @ORM\JoinTable(name="role_resource",
 * joinColumns={@ORM\JoinColumn(name="role_id", referencedColumnName="id")},
 * inverseJoinColumns={@ORM\JoinColumn(name="resource_id", referencedColumnName="id")}
 * )
 */
protected $resource;

Итак, на данный момент я застрял и не могу использовать инструменты генерации схемы ORM. Это постоянная ошибка. Я очистил мою базу данных, сгенерировал схему заново с помощью ORM, но все равно застреваю эту ошибку всякий раз, когда я пытаюсь сделать обновление через ORM, как я описываю в этом сообщении. Где, возможно, я должен смотреть дальше?


Обновление: проследить его до этого кода: $ sql перед этой строкой ==

SELECT COLUMN_NAME AS Field, 
    COLUMN_TYPE AS Type,
    IS_NULLABLE AS `Null`,
    COLUMN_KEY AS `Key`,
    COLUMN_DEFAULT AS `Default`,
    EXTRA AS Extra,
    COLUMN_COMMENT AS Comment,
    CHARACTER_SET_NAME AS CharacterSet,
    COLLATION_NAME AS CollactionName,
FROM information_schema.COLUMNS 
WHERE TABLE_SCHEMA = 'loginauth' AND TABLE_NAME = 'role_resource'

который, когда я запускаю его в форме запроса MySQL, возвращает (некоторые столбцы были обрезаны):

+-------------+---------+------+-----+--------------+----------------+
| Field       | Type    | Null | Key | CharacterSet | CollactionName |
+-------------+---------+------+-----+--------------+----------------+
| role_id     | int(11) | NO   | PRI | NULL         | NULL           |    
| resource_id | int(11) | NO   | PRI | NULL         | NULL           |
+-------------+---------+------+-----+--------------+----------------+

а $this->executeQuery($sql, $params, $types) возвращает правильный (?) оператор, который отлично работает в моем приглашении, но когда вызывается ->fetchAll(), а именно fetchAll(), разбивается и возвращает пустой массив. Могу ли я заставить кого-то понять это?

MORE:

По существу, из вышеперечисленных ссылок $this->executeQuery($sql, $params, $types) возвращает:

object(Doctrine\DBAL\Driver\PDOStatement)#531 (1) {
    ["queryString"]=> string(332) "SELECT COLUMN_NAME AS Field, COLUMN_TYPE AS Type, IS_NULLABLE AS `Null`, COLUMN_KEY AS `Key`, COLUMN_DEFAULT AS `Default`, EXTRA AS Extra, COLUMN_COMMENT AS Comment, CHARACTER_SET_NAME AS CharacterSet, COLLATION_NAME AS CollactionName FROM information_schema.COLUMNS WHERE TABLE_SCHEMA = 'loginauth' AND TABLE_NAME = 'role_resource'"
}

но затем $this->executeQuery($sql, $params, $types)->fetchAll() (добавление fetchAll()) возвращает следующее:

array(0) {
}

И это так грустно, мои друзья:( потому что я не знаю, почему он возвращает пустой массив, когда оператор в вышеприведенной строке queryString настолько ясен и полезен.

Ответ 2

Убедитесь, что имена столбцов, используемые в определениях "index" и "uniqueContraints", действительно существуют:

Например, используя аннотации:

@ORM\Table(name="user_password_reset_keys", indexes={@ORM\Index(name="key_idx", columns={"key"})} )

Я переименовал свой столбец из "ключа" в "reset_key", и это несоответствие имени столбца вызвало ошибку

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

Ответ 3

Поздний ответ, но может помочь кому-то У меня такая же проблема. Это было потому, что я использовал командную строку Symphony для создания сущности и верблюжьего случая, вызывающего некоторые из его свойств. Затем, когда Doctrine создает таблицу, также через командную строку, она заменяет случай верблюда для соглашения "_".

Ответ 4

Я использовал программное обеспечение ORM Designer под названием Skipper, которое экспортирует мои объекты для меня. Моя проблема только для одной таблицы только из 30. Было ли это, что я отсутствовал атрибут name в моих аннотациях. Пример.

@ORM\Column(name="isActive", ....

Я добавил этот атрибут "name=", и он снова работает!