我正在使用 Propel 1.7-dev 并且正在玩类委托,即表“继承”。我已经将 Propel1 和 Phing 设置为 Git 子模块,并且每个都在各自的主模块上检出。我的模型建立起来,我可以让层次结构工作,但如果我按照文档(可以说更干净)来做,那么它就会失败。
这是我的模型的相关片段:
<table name="process_step">
<column name="id" type="integer" required="true" primaryKey="true" autoIncrement="true" />
<column name="process_id" type="integer" required="true" />
<column name="ordinal" type="integer" required="true" />
<column name="comment" type="varchar" size="256" />
<column name="type" type="enum" required="true"
valueSet="load, submit_form, check_page, get_links"
/>
<column name="is_enabled" type="boolean" required="true" default="false" />
<foreign-key foreignTable="process">
<reference local="process_id" foreign="id" />
</foreign-key>
</table>
<table name="process_step_load">
<column name="id" type="integer" required="true" primaryKey="true" />
<behavior name="delegate">
<parameter name="to" value="process_step" />
</behavior>
<column name="url" type="varchar" size="1024" />
<column name="method" type="varchar" size="6" required="true" default="get" />
</table>
实际上还有更多的子模型,但为了简洁起见,我将它们删除了。
首先要注意的是文档显示父类和子类定义都具有自动递增的主键。但是这是不可能的:主键必须在父项中设置,并复制到子项中(因为父项总是有一行)。我相信这是文档中的一个错误,但我会在这个问题之后提供一个补丁,以防我误解了一些东西。
所以,这是我的工作代码:
$process = new Process();
$processStep = new ProcessStep();
$processStep->setOrdinal(1); // Simplified for brevitiy
$processStep->setType(1); // Ditto
$processStep->setProcess($process);
// This creates a primary key which we use below (i.e. a cascading
// save won't work)
$processStep->save();
$processStepChild->setId($processStep->getId());
$processStepChild->save();
这是文档的方式:
$process = new Process();
$processStep = new ProcessStep();
$processStep->setOrdinal(1); // Simplified for brevitiy
$processStep->setType(1); // Ditto
$processStep->setProcess($process);
$processStepChild->setProcessStep($processStep);
$processStepChild->save();
这样做的结果是,在我创建四个子行(每个不同类型)的地方,主键在父级(ProcessStep)中设置得很好,但在子级(ProcessStepLoad 和其他)中都设置为零。
即使我添加了中间保存,这也无济于事。因此,在我看来这$processStepChild->setProcessStep($processStep)
就是问题所在 - 它应该解决它在一个委托子节点上,并将该子节点的主键更改为提供的父节点的键。它显然没有这样做。
一些可能相关的问题:
- 我是否正确理解了班级委派?据我所知,父键应该是自动递增的主键,并且必须在子键中用作手动主键以形成层次关系。(旁白:我曾认为有一种方法可以自动确定父级的类型,但鉴于它本身不添加类型列,这是不可能的。这就是为什么我
enum
在父级中手动添加) - 我使用 Propel master,而不是 1.6.x 正式版本,会破坏一些东西吗?