在Doctrine记录类中,从DB查询相同记录会覆盖该类中的属性

时间:2016-04-07 15:57:43

标签: doctrine symfony1 symfony-1.4 doctrine-1.2

在我的一个Doctrine记录类中,我有一个void conn_handler(xmpp_conn_t * const conn, const xmpp_conn_event_t status, const int error, xmpp_stream_error_t * const stream_error, void * const userdata) { if (status == XMPP_CONN_CONNECT) { fprintf(stderr, "DEBUG: connected\n"); } else { fprintf(stderr, "DEBUG: disconnected\n"); } } void main() { xmpp_log_t *log; char *jid; jid = strdup("test@domain.com") xmpp_initialize(); log = xmpp_get_default_logger(XMPP_LEVEL_ERROR); cwmp->xmpp_ctx = xmpp_ctx_new(NULL, log); cwmp->xmpp_conn = xmpp_conn_new(cwmp->xmpp_ctx); xmpp_conn_set_jid(cwmp->xmpp_conn, jid); xmpp_conn_set_pass(cwmp->xmpp_conn, cwmp->xmpp_param.password); xmpp_connect_client(cwmp->xmpp_conn, NULL, 0, conn_handler, cwmp->xmpp_ctx); xmpp_run(cwmp->xmpp_ctx); } 方法来执行检查。在此检查中,查询是在我的记录所属的同一个表上完成的。该查询将从表中获取一条记录,并使用水合结果与该类所代表的当前记录进行比较。

在某些情况下,获取的水合结果将与我在preSave检查中使用的记录相同。但是,当发生这种情况时,一旦查询完成,我对第一条记录所做的任何更改都将被还原。

为什么会这样?有解决方法吗?

1 个答案:

答案 0 :(得分:1)

Doctrine可能维护对记录对象实例的单个引用,而不是在preSave()方法中创建一个全新的实例。因此,当对象被水合时,代码中任何其他相同类型的变量都会被刷新'。

要验证这一点,请使用spl_object_hash()函数检查代码中变量的对象ID。

如果没有看到您的代码,解决方法建议可能会有所不同,但一种可能的解决方法是在preSave()中水合数组:

$query = Doctrine_Query::create()
->select('foo')
->from('Bar b')
->where('b.id = ?', $id);

$results = $query->execute(array(), Doctrine::HYDRATE_ARRAY);

您将失去将结果用作对象的能力,但您将能够使用数组的内容进行比较。