【发布时间】:2015-02-05 09:17:45
【问题描述】:
我正在尝试将现有数据库与 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()-based-methods 开始正常工作。数据库架构更新是次要问题...(如果这与 findXXX() 问题没有直接关系)。
【问题讨论】:
-
正如我在您的转储 sql 语句中看到的,您将
categorieid 类型设置为 tinyint(1) 并且您的所有问题都是由它引起的(tinyint(1) 的值仅为 0、1) .要解决所有问题,请将 id 类型定义更改为 int。 -
@kibao,仅供参考
tinyint可以存储 -128 到 +127 或 0 到 255(无符号) -
findAll() 返回一个数组。很明显,您没有正确地迭代数组。
-
@Cerad:我不是在遍历数组,而是在整个结果上使用 print_r。第二个例子清楚地表明存在问题。我使用 Doctrine 至少一年了,这是我第一次看到。
-
@b.b3rn4rd 我同意
tinyint,但tinyint(1)只显示0,1。 stackoverflow.com/a/4401696/1851887.
标签: mysql symfony doctrine-orm