我有一个在Doctrine中运行的查询;它现在失败了,但是以一种奇怪的方式。这个查询已经工作了一年,我只是通过添加几个新库并更改了一些版本来搞砸我的composer.json
。我还更新了我的Linux盒子(也许MySQL或MariaDB已更新,不确定)。
无论发生了什么变化(怀疑它是我的bundle的Doctrine模型代码,除非它首先不是犹太教并且核心更新现在将其显示为已损坏),查询现在返回结果,具有正确数量的数组键,但值以某种方式变为NULL。该数组看起来与此完全相同,是来自var_dump的直接复制和粘贴,例如
var_dump($query->getSql());
var_dump($results);
exit;
select GoalLabel from opt_goals where scale = 'mathematics'
array(17) { [0]=> NULL [1]=> NULL [2]=> NULL [3]=> NULL [4]=> NULL [5]=> NULL [6]=> NULL [7]=> NULL [8]=> NULL [9]=> NULL [10]=> NULL [11]=> NULL [12]=> NULL [13]=> NULL [14]=> NULL [15]=> NULL [16]=> NULL }
但是当我在MySQL命令行中运行相同的查询时,我得到的实际结果是相同数量的键,但的值是。
以下是我的composer.json
要求部分的非默认部分:
"components/jquery": "~1.11,<2.0",
"twbs/bootstrap": "3.3.*",
"braincrafted/bootstrap-bundle": "~2.1",
"knplabs/knp-menu": "~1.1",
"knplabs/knp-menu-bundle": "~1.1",
"knplabs/knp-paginator-bundle": "dev-master",
"symfony/icu": "1.1.*",
"mnot/hinclude": "dev-master",
"rhumsaa/array_column": "~1.1",
"webfactory/exceptions-bundle": "@stable",
"friendsofsymfony/jsrouting-bundle": "~1.5",
"hearsay/require-js-bundle": "~1.0",
"browserstate/history.js": "dev-master"
密切关注任何版本调整,因为我确实搞砸了这个。但是我不知道Doctrine在哪个方面走得很远。
编辑:根据最新评论和now seeing this,这是怎么回事?实际上this URL更合适,因为我没有使用doctrine/dbal
,我正在使用doctrine/orm
。
答案 0 :(得分:5)
此问题是由于从{2.4}更新doctrine/orm
到版本2.5而引起的。有很多BC breaks。
将doctrine/orm
降级为https://packagist.org/packages/doctrine/orm#v2.4.7,问题就会消失。在知道这是您的问题后,您需要重写查询以满足任何新要求。我确实在那里看到了关于MariaDB问题的说明。
事实上,由于我还没有完全解决这个问题,所以它可能就像重新生成实体一样容易。我这样做时总是犹豫不决......
答案 1 :(得分:2)
今天我不得不面对这个“问题”。在我的例子中,所有都是关于标记为@id的列中的空值。让我告诉你。
这是发票的表格:
mysql> select * from payments;
+----------------------------------+---------------------+-------+---------+
| transaction | date | total | invoice |
+----------------------------------+---------------------+-------+---------+
| JB2BJ43dqhI7xiVxP1j1ExlIbraplHiS | 2015-04-24 21:23:08 | 320 | 3 |
| DIavWPjtVf9ZJ0m4GBnP2ZDCBzV4PBmQ | 2015-04-24 21:49:39 | 320 | 4 |
| XporZAkdIFDbdq9Uzvw1rp2GD4W98esy | 2015-04-24 22:18:10 | 320 | 5 |
| OFgUCb5kdjftqiNUmU6BCok47EZ6Sw2X | 2015-04-27 01:10:01 | 25 | 10 |
+----------------------------------+---------------------+-------+---------+
我添加了一个新列,以便标记为主键:
mysql>alter table invoices add column `id_payment` int auto_increment;
mysql> select id_payment, transaction, date, total, invoice from paymen
s limit 4;
+------------+----------------------------------+---------------------+-------+--------+
| id_payment | transaction | date | total | invoice|
+------------+----------------------------------+---------------------+-------+--------+
| NULL | JB2BJ43dqhI7xiVxP1j1ExlIbraplHiS | 2015-04-24 21:23:08 | 320 | 3|
| NULL | DIavWPjtVf9ZJ0m4GBnP2ZDCBzV4PBmQ | 2015-04-24 21:49:39 | 320 | 4|
| NULL | XporZAkdIFDbdq9Uzvw1rp2GD4W98esy | 2015-04-24 22:18:10 | 320 | 5|
| NULL | OFgUCb5kdjftqiNUmU6BCok47EZ6Sw2X | 2015-04-27 01:10:01 | 25 | 10|
+------------+----------------------------------+---------------------+-------+--------+
现在,在Invoice
模型中,我将新列设置为主键:
/**
* @entity
* @table(name="invoices")
*/
class Invoice
{
/**
* @id
* @column(type="int", name="id_payment")
*/
protected $id;
// ...
当我更改表格时,id_payment
列中的所有值都为空。这将返回空值,即使所有其他字段都包含信息:
$qb = $em->createQueryBuilder();
$qb->select(['a']);
$qb->from(Invoice::class, 'a');
$invoices = $qb->getQuery()->getArrayResult();
dd($invoices);
结果:
[
null,
null,
null,
null,
]
答案 2 :(得分:0)
它是因为你做了var_dump。
var_dump仅显示当前状态的项目,因为尚未填充对象本身。如果你懒得加载它们,它们就会被拉上第一个电话。
答案 3 :(得分:0)
检查您的实体中是否有@ORM \ Id注释!