在我的一个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
检查中使用的记录相同。但是,当发生这种情况时,一旦查询完成,我对第一条记录所做的任何更改都将被还原。
为什么会这样?有解决方法吗?
答案 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);
您将失去将结果用作对象的能力,但您将能够使用数组的内容进行比较。