Symfony2和Doctrine 2结果数据错误地返回一个空数组

时间:2015-04-25 04:14:19

标签: symfony doctrine-orm

我有一个在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

4 个答案:

答案 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注释!