我正在用 Propel 做各种各样的事情,这可能有点边缘情况——特别是我发现与表名关联的类名被缓存在某处,并且由于我重建了一个具有不同类名但表名相同的模型(用于单元测试目的)推进是正确的泡菜。(对于这个问题,您不需要 Propel 经验;只需了解 PHP,尤其可能是魔术调用)。
为了调试这个问题,我发现 Propel 在设置列值时会为表填充一个“tablemap”类。我的目的是找出这个填充发生在代码中的哪个位置,这样我就可以清除 Propel 中缓存的 tablemap(s)。
具体来说,TestOrganiser 类有一个生成的父 BaseTestOrganiser,它有一个列设置方法,因此:
// The ** lines are mine, the rest are auto-generated by propel.
// The output when setting a value and saving is "no yes " which
// shows that the '$this->modifiedColumns[]' line triggers the
// tablemap population
public function setName($v)
{
if ($v !== null) {
$v = (string) $v;
}
if ($this->name !== $v) {
$this->name = $v;
$map = Propel::getDatabaseMap('test'); // **
echo $map->getTables() ? 'yes ' : 'no '; // **
$this->modifiedColumns[] = TestOrganiserPeer::NAME;
echo $map->getTables() ? 'yes ' : 'no '; // **
}
return $this;
} // setName()
根据评论, $map->getTables() 的值作为该$this->modifiedColumns[] = TestOrganiserPeer::NAME
行的结果从空变为非空。但是,这个类或其子类或父类中没有 __set() 方法,所以我很困惑这里可以触发什么代码。
有任何想法吗?