当我做:
vendor/bin/doctrine-module orm:schema-tool:update
Run Code Online (Sandbox Code Playgroud)
Doctrine 2.4给了我这个错误:
[Doctrine\DBAL\Schema\SchemaException]
There is no column with name 'resource_id' on table 'role_resource'.
Run Code Online (Sandbox Code Playgroud)
我的实际MySQL数据库模式具有列和表,从运行此命令可以看出(没有抛出错误):
mysql> select resource_id from role_resource;
Empty set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
因此,错误必须在Doctrine对模式的表示中的某处.我做了var_dump()的$this对象,这里是我得到了(部分):
object(Doctrine\DBAL\Schema\Table)#546 (10) {
["_name" :protected] => string(13) "role_resource"
["_columns":protected] => array(0) { }
Run Code Online (Sandbox Code Playgroud)
请注意,实际上,_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;
Run Code Online (Sandbox Code Playgroud)
所以目前,我陷入困境,无法使用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'
Run Code Online (Sandbox Code Playgroud)
当我从MySQL提示符运行它时,返回(修剪了一些列):
+-------------+---------+------+-----+--------------+----------------+
| Field | Type | Null | Key | CharacterSet | CollactionName |
+-------------+---------+------+-----+--------------+----------------+
| role_id | int(11) | NO | PRI | NULL | NULL |
| resource_id | int(11) | NO | PRI | NULL | NULL |
+-------------+---------+------+-----+--------------+----------------+
Run Code Online (Sandbox Code Playgroud)
并$this->executeQuery($sql, $params, $types)返回正确的(?)语句,该语句在我的提示符下正常运行,但是当->fetchAll()调用时,特别是这个fetchAll()它会分解并返回一个空数组.我可以让某人理解这个吗?
更多:
基本上,从上面的链接$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'"
}
Run Code Online (Sandbox Code Playgroud)
但然后$this->executeQuery($sql, $params, $types)->fetchAll()(添加fetchAll()),返回:
array(0) {
}
Run Code Online (Sandbox Code Playgroud)
这让我的朋友们感到非常伤心:(因为我不知道为什么它返回一个空数组,当上面的queryString中的语句非常有效且富有成效时.
Ons*_*hop 16
检查'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;
Run Code Online (Sandbox Code Playgroud)
事实证明,我的数据库权限阻止了我的数据库用户读取该特定表。使用GRANT SELECT ...解决了这个问题。此外,DBAL 团队还追踪到了 MySQL 和 SQL Server 中返回 NULL 的数据库权限特性。
| 归档时间: |
|
| 查看次数: |
11036 次 |
| 最近记录: |