学说总是和同样的记录一样。架构:更新失败

时间:2014-12-07 17:50:50

标签: mysql symfony doctrine-orm

我正在尝试使用Symfony / Doctrine的现有数据库,似乎没有任何工作。

导入(数据库到映射)成功,src / xxx / Entity中生成的文件看起来很好。

然而,有两个问题:

问题

Doctrine希望在我那个荒谬的小数据库上运行13个查询。我认为在导入之后,Doctrine会与在线数据库同步。然而,事实并非如此。

如果我没有修改数据库(因为原因)会更好,并且在任何情况下doctrine:schema:update完全失败:

### doctrine:schema:update --dump-sql
ALTER TABLE categorie CHANGE id id TINYINT(1) NOT NULL;
ALTER TABLE produit CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE categorie_id categorie_id TINYINT(1) DEFAULT NULL, CHANGE derniere_maj derniere_maj DATETIME NOT NULL;
DROP INDEX fk_produit_categorie1_idx ON produit;
CREATE INDEX IDX_29A5EC27BCF5E72D ON produit (categorie_id);
ALTER TABLE commande_client CHANGE id id INT AUTO_INCREMENT NOT NULL, CHANGE client_id client_id INT DEFAULT NULL, CHANGE date_creation date_creation DATETIME NOT NULL, CHANGE no_confirmation no_confirmation INT NOT NULL;
DROP INDEX fk_commande_client_client1_idx ON commande_client;
CREATE INDEX IDX_C510FF8019EB6921 ON commande_client (client_id);
ALTER TABLE commande_client_vers_produit DROP quantite, CHANGE commande_client_id commande_client_id INT NOT NULL, CHANGE produit_id produit_id INT NOT NULL;
DROP INDEX fk_commande_client_has_produit_commande_client1_idx ON commande_client_vers_produit;
CREATE INDEX IDX_6E3497729E73363 ON commande_client_vers_produit (commande_client_id);
DROP INDEX fk_commande_client_has_produit_produit1_idx ON commande_client_vers_produit;
CREATE INDEX IDX_6E349772F347EFB ON commande_client_vers_produit (produit_id);
ALTER TABLE client CHANGE id id INT AUTO_INCREMENT NOT NULL;

### doctrine:schema:update --force

  [Doctrine\DBAL\Exception\DriverException]                                                                               
  An exception occurred while executing 'ALTER TABLE categorie CHANGE id id TINYINT(1) NOT NULL':                         
  SQLSTATE[HY000]: General error: 1025 Error on rename of './chezbio/#sql-1983_d2' to './chezbio/categorie' (errno: 150)  

  [Doctrine\DBAL\Driver\PDOException]                                                                                     
  SQLSTATE[HY000]: General error: 1025 Error on rename of './chezbio/#sql-1983_d2' to './chezbio/categorie' (errno: 150)  

  [PDOException]                                                                                                          
  SQLSTATE[HY000]: General error: 1025 Error on rename of './chezbio/#sql-1983_d2' to './chezbio/categorie' (errno: 150)  

为什么所有这些更新?实际上,数据库在理论上是正确设计的。

问题最重要的部分:

(这可能与Doctrine无法与在线数据库同步的部分有关。)

我正在尝试select我桌子上的几行。

例如,在这里我尝试从categorie表中获取所有行:

$em->getRepository('AlembicBioBundle:Categorie')->findAll();

我在这张表中有4行:

mysql> SELECT * FROM categorie;
+----+----------+
| id | nom      |
+----+----------+
|  1 | FROMAGES |
|  2 | PAINS    |
|  3 | LEGUMES  |
|  4 | VIANDES  |
+----+----------+

当我使用Doctrine函数(而不是手动查询)时,我会出现4次“FROMAGES”行。 可能导致此问题的原因是什么?

最糟糕的是我做的时候:

$em->getRepository('AlembicBioBundle:Categorie')->findOneByNom('PAINS');

它会返回以下结果:

Alembic\BioBundle\Entity\Categorie Object
(
    [nom:Alembic\BioBundle\Entity\Categorie:private] => PAINS
    [id:Alembic\BioBundle\Entity\Categorie:private] => 1
)

PAINS的ID不应为1 ...

如果我尝试:$repo->findXXX(),我也会得到奇怪的输出。

优先级:我想找到一种方法让我的 find() - 基于方法开始正常工作。数据库架构更新是次要问题...(如果这与findXXX()问题没有直接关系)。

1 个答案:

答案 0 :(得分:3)

前奏

修复映射元数据应该是最高优先级。当映射元数据不正确或与数据库不同步时,可能会发生各种奇怪的事情。

我怀疑你所描述的大多数问题都来自于学说使用不正确的标识符属性定义这一事实。

修复映射元数据

命令doctrine:mapping:import将尝试基于现有数据库创建映射元数据。这个过程是猜测工作,很可能不会导致100%正确的映射元数据。

重要的是手动浏览映射元数据 并更正需要纠正的内容。请这样做。

我怀疑标识符属性(db中的id列)是使用“Doctrine mapping type”boolean映射的。这是doctrine:schema:update命令尝试将列类型更改为TINYINT(1)的原因之一。您可能希望在此处使用类型integer

您可以使用命令doctrine:schema:validate检查映射元数据是否正确并与数据库同步。

也许你可能会遇到一个不容易解决的情况。并非所有数据库供应商的所有构造都受到Doctrine的支持。在许多情况下,它可以解决,但请提出一个专门针对该特定案例的新问题。

小建议

请不要使用改变映射元数据的命令/生成器,也不要使用实体。

当存在非元素(在项目开始时)时生成映射元数据很好,但是我的经验表明,重复执行它以更改映射元数据(尤其是实体)会产生比它解决的问题更多的问题。

恕我直言,你应该从你的代码到你的数据库(而不是相反)。