学说没有刷新实体,并且返回了错误的值,发生了什么?


Doctrine is not flushing entity and is returning the wrong value, what's happen?

我将这段代码作为Restful API方法的一部分:

// $soqlObj1['records'][0]['Id'] == "005800000039cQbAAI"
$entRep = $em->getRepository('PDOneBundle:Representative')->find($soqlObj1['records'][0]['Id']);
dump($entRep); // line 114
if ($entRep->getRepTokenId() === null) {
    $xsession = bin2hex(openssl_random_pseudo_bytes(100));
    $entRep->setRepTokenId($xsession);
    $em->flush();
    dump($xsession); // line 121
    dump($entRep->getRepTokenId()); // line 122
}
dump($entRep); // line 125

这是每个dump()语句的输出:

in SessionRestController.php line 114:
Representative {#2369 ▼
  #rep_id: "005800000039cQbAAI"
  #display_name: "Joan Brooks"
  #avatar_url: "https://pdone.s3.amazonaws.com/avatar/default_avatar.png"
  #rep_type: "VEEVA"
  #username: "ertvn52@pdi-inc.com.train"
  #first: "Joan"
  #last: "Brooks"
  #title: null
  #bio: null
  #phone: null
  #email: "jbrooks@pdi-inc.com.train"
  #inactive: false
  #lastLoginAt: DateTime {#2365 ▶}
  #territory: Territory {#2422 ▶}
  #repTokenId: null
  #createdAt: DateTime {#2366 ▶}
  #updatedAt: DateTime {#2367 ▼
    +"date": "2015-08-21 15:03:07.000000"
    +"timezone_type": 3
    +"timezone": "America/New_York"
  }
  -file: null
}
in SessionRestController.php line 121: 
"79e5ead64a2e1d2ba2ecac1b7dbbabb5fd6ec2b2659fb6bc2ae98d613bfc9aae623fd81dfe2c15ef72f1565ed2f41619baf574387a16a6b1138b2b730c75b21a7081587e9b0494c30b557cdc562a517013d6b78d82bbe4af3e71faaa7257e1caf0aa2342"
in SessionRestController.php line 122: 
"79e5ead64a2e1d2ba2ecac1b7dbbabb5fd6ec2b2659fb6bc2ae98d613bfc9aae623fd81dfe2c15ef72f1565ed2f41619baf574387a16a6b1138b2b730c75b21a7081587e9b0494c30b557cdc562a517013d6b78d82bbe4af3e71faaa7257e1caf0aa2342"
in SessionRestController.php line 125: ▶
Representative {#2369 ▼
  #rep_id: "005800000039cQbAAI"
  #display_name: "Joan Brooks"
  #avatar_url: "https://pdone.s3.amazonaws.com/avatar/default_avatar.png"
  #rep_type: "VEEVA"
  #username: "ertvn52@pdi-inc.com.train"
  #first: "Joan"
  #last: "Brooks"
  #title: null
  #bio: null
  #phone: null
  #email: "jbrooks@pdi-inc.com.train"
  #inactive: false
  #lastLoginAt: DateTime {#2365 ▶}
  #territory: Territory {#2422 ▶}
  #repTokenId: "79e5ead64a2e1d2ba2ecac1b7dbbabb5fd6ec2b2659fb6bc2ae98d613bfc9aae623fd81dfe2c15ef72f1565ed2f41619baf574387a16a6b1138b2b730c75b21a7081587e9b0494c30b557cdc562a517013d6b78d82bbe4af3e71faaa7257e1caf0aa2342"
  #createdAt: DateTime {#2366 ▶}
  #updatedAt: DateTime {#2393 ▼
    +"date": "2015-08-21 15:11:18.000000"
    +"timezone_type": 3
    +"timezone": "America/New_York"
  }
  -file: null
}

如果我在DB上运行这个查询SELECT repTokenId, updatedAt FROM reps WHERE rep_id='005800000039cQbAAI',我得到了这个结果:

+--------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| repTokenId                                                                                                                                             | updatedAt           |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+
| 79e5ead64a2e1d2ba2ecac1b7dbbabb5fd6ec2b2659fb6bc2ae98d613bfc9aae623fd81dfe2c15ef72f1565ed2f41619baf574387a16a6b1138b2b730c75b21a7081587e9b0494c30b557c | 2015-08-21 15:11:18 |
+--------------------------------------------------------------------------------------------------------------------------------------------------------+---------------------+

为什么实体返回错误的值?为什么正确的$xsession值没有更新?为什么$entRep->getRepTokenId()给我一个不存在于会话变量或任何其他地方的未知值?这里发生了什么?

真奇怪。开始时,来自db的repTokenId是空的(转储在114行)。在持久化之后,您的实体(转储在125行)和db(您的SELECT sql)的值不同于null。结论:Doctrine 冲洗实体,因为如果它不这样做,你就会在db中有null

你在db中的新值是你的令牌,但不知何故它被截断了。所以我要检查两件事:

  1. repTokenId字段在db中的长度。它足够长,能有这么长的值吗?
  2. 实体定义中repTokenId字段长度