任何人都可以解释以下学说模式验证错误消息吗:
这是多对多关系中每个实体的 yaml ORM 定义,根据 文档的第 5.9 节创建。
Rep\Bundle\ProjectBundle\Entity\User:
type: entity
table: User
fields:
id:
id: true
type: integer
unsigned: true
nullable: false
generator:
strategy: AUTO
username:
type: string
length: 25
fixed: false
nullable: false
salt:
type: string
length: 32
fixed: false
nullable: false
password:
type: string
length: 40
fixed: false
nullable: false
email:
type: string
length: 60
fixed: false
nullable: false
manyToMany:
roles:
targetEntity: UserRole
inversedBy: users
joinTable:
name: UserRoleLookup
joinColumns:
user_id:
referencedColumnName: id
inverseJoinColumns:
user_role_id:
referencedColumnName: id
lifecycleCallbacks: { }
以及 UserRole 逆 yaml 配置:
Rep\Bundle\ProjectBundle\Entity\UserRole:
type: entity
table: UserRole
fields:
id:
id: true
type: integer
unsigned: true
nullable: false
generator:
strategy: AUTO
name:
type: string
length: 50
fixed: false
nullable: false
manyToMany:
users:
targetEntity: User
mappedBy: roles
lifecycleCallbacks: { }
这是用户表架构:
CREATE TABLE `User` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(25) COLLATE utf8_unicode_ci NOT NULL,
`salt` varchar(32) COLLATE utf8_unicode_ci NOT NULL,
`password` varchar(40) COLLATE utf8_unicode_ci NOT NULL,
`email` varchar(60) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
UserRole 表架构:
CREATE TABLE `UserRole` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`name` varchar(50) COLLATE utf8_unicode_ci NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;
以及 UserRoleLookup 架构:
CREATE TABLE `UserRoleLookup` (
`user_id` int(11) unsigned NOT NULL,
`user_role_id` int(11) unsigned NOT NULL,
PRIMARY KEY (`user_id`,`user_role_id`),
KEY `user_role_id` (`user_role_id`),
CONSTRAINT `userrolelookup_ibfk_2` FOREIGN KEY (`user_role_id`) REFERENCES `userrole` (`id`) ON DELETE CASCADE ON UPDATE CASCADE,
CONSTRAINT `userrolelookup_ibfk_1` FOREIGN KEY (`user_id`) REFERENCES `user` (`id`) ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
如您所见,这是一个非常简单的设置,带有一个查找表来指示用户的角色或给定用户角色中的用户集。但是,我收到了这个令人沮丧的同步错误。我在这里或网上没有阅读任何内容,以任何简洁的细节回答这个问题,我希望有人能澄清我是否可以安全地离开此配置并忽略此错误?
运行此命令以显示 SQL 中的差异,而无需转储数据库:
php bin/console doctrine:schema:update --dump-sql
您还可以运行以下命令来执行更改:
php bin/console doctrine:schema:update --force --full-database
对于 symfony2 来说是
php app/console doctrine:schema:update --force --full-database
app/console
改为bin/console
,
--full-database
至 --complete
所以最终的命令是:
php bin/console doctrine:schema:update --force --complete --dump-sql
很简单:某些字段或关系或实体等尚未转换为数据库模式中的列或表。更新你的架构,你就会没事的。
对于对此感兴趣的任何人,重新生成我的表模式会产生以下查找模式:
CREATE TABLE `UserRoleLookup` (
`user_id` int(11) NOT NULL,
`user_role_id` int(11) NOT NULL,
PRIMARY KEY (`user_id`,`user_role_id`),
KEY `IDX_4511E771A76ED395` (`user_id`),
KEY `IDX_4511E7718E0E3CA6` (`user_role_id`),
CONSTRAINT `FK_4511E7718E0E3CA6` FOREIGN KEY (`user_role_id`) REFERENCES `UserRole` (`id`),
CONSTRAINT `FK_4511E771A76ED395` FOREIGN KEY (`user_id`) REFERENCES `User` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;\
我猜 symfony2-doctrine 包不太喜欢无符号整数,因为我可以看到我发布的模式几乎没有变化。不管怎样,问题解决了。
我也有同样的问题。另外,跑步的时候
php bin/console doctrine:schema:update --dump-sql
无论我已经执行了sql,它总是显示相同的sql。看起来上面的命令无法检测数据库模式和当前实体元数据之间的真正差异。我还验证了此类问题在某种程度上与您使用的数据库有关。 因为我至少在 MySQL 5.7.25 中没有此类问题,但在 MariaDB 10.2.24 中。请在此处查看更多信息:https://github.com/symfony/symfony/issues/27166#issue-320494745
附注MariaDB 给我带来了其他麻烦,例如“索引键长度 767 字节”。并不是说它不好。但让我想起三年前,当我第一次决定使用 MariaDB 时,帖子/新闻说它与刚刚被 Oracle 收购的 MySQL 相比有多好。有消息说 MySQL 将会有所不同,然后恐慌......(只是个人意见)
如果您正在运行这些命令:
php bin/console doctrine:schema:update --force --complete --dump-sql
并且生成的 SQL 不会创建新的实体(没有 CREATE TABLE),您最好检查您的映射是否正确。就我而言,我忘记将其放入映射中:
* @ORM\Entity
php bin/console 学说:schema:update --dump-sql [确定] 没有要处理的元数据类 symfony 控制台学说:架构:验证 [错误] 数据库架构与当前映射文件不同步 不工作
php bin/console 学说:schema:update --dump-sql 它可能可以解决我的问题