原则2:表'$ table'上没有名为'$ columnName'的列

时间:2014-01-03 15:49:29

标签: doctrine-orm

当我这样做时:

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键确实不包含任何列how Doctrine checks for column names

在我的例子中,部分跟踪转储如下:

阅读其他类似问题的帖子,似乎暗示我可能在列案例中有错误(上层与下层)。虽然我可能错过了一些东西,但查看我在数据库上的实际架构和我的代码中的注释似乎建议匹配(全部小写)。同样,Doctrine2's code does incorporate checks for such casing errors。所以我排除错误套管的可能性。

我看到的另一篇帖子表明我的注释可能存在错误,即错误的命名,语法或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进行更新时,仍会遇到此错误,正如我在本文中所描述的那样。接下来我应该去哪儿看看?


更新:追溯到this code: 这行之前的$ 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中的语句非常有效且富有成效时。

4 个答案:

答案 0 :(得分:15)

检查' index'中使用的列名称和' uniqueContraints'模式定义实际存在:

例如使用Annotations:

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

我已将我的专栏重命名为' key'到' reset_key'并且此列名称不匹配导致错误

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

答案 1 :(得分:3)

原来我的数据库权限阻止了我的数据库用户读取该特定表。使用GRANT SELECT ...修复了问题。另外,DBAL team traced it to a DB Permissions peculiarity returning NULL in MySQL and SQL Server

答案 2 :(得分:1)

迟到的回答,但可能对某人有所帮助 我有同样的问题。这是因为我使用Symphony的命令行来创建我的实体和驼峰案例来调用它的一些属性。然后,当Doctrine创建表时,也通过命令行,它会改变" _"约定的驼峰情况。

答案 3 :(得分:0)

我正在使用名为Skipper的ORM Designer软件为我导出我的实体。我的问题仅在于30个表中的一个表。我是否在我的注释中缺少name属性。实施例。

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

我添加了属性“name =”,它再次起作用了!