我对Propel2 (2.0.0-dev版本)有问题。
我有三个外键指向同一个表:
<foreign-key foreignTable="sites" phpName="Site" refPhpName="Timesheet">
<reference local="siteID" foreign="siteID"/>
</foreign-key>
<foreign-key foreignTable="sites" phpName="FromSite">
<reference local="from_siteID" foreign="siteID"/>
</foreign-key>
<foreign-key foreignTable="sites" phpName="ToSite">
<reference local="to_siteID" foreign="siteID"/>
</foreign-key>尽管有不同的PhpNames,但是基类不正确地生成default: $key:
if (null !== $this->aToSite) {
switch ($keyType) {
case TableMap::TYPE_CAMELNAME:
$key = 'site';
break;
case TableMap::TYPE_FIELDNAME:
$key = 'sites';
break;
default:
$key = 'Site';
}
$result[$key] = $this->aToSite->toArray($keyType, $includeLazyLoadColumns, $alreadyDumpedObjects, true);
}default: $key应该是ToSite,而不是Site。同样适用于FromSite。因此,Site表仅用于Site,而不用于FromSite和ToSite,这随后不允许我使用FromSite和ToSite调用对象。
这些表格以下列方式连接:
$timesheets = TimesheetQuery::create()
->select(Timesheet::getTransferFieldsWithRelations())
...
->joinWith("Timesheet.FromSite FromSite", Criteria::LEFT_JOIN)
->joinWith("Timesheet.ToSite ToSite", Criteria::LEFT_JOIN)
->joinWith("Timesheet.Site Site", Criteria::LEFT_JOIN)
...有办法绕道吗?
发布于 2015-10-15 10:37:58
我们设法解决了上述问题。在Propel/Generator/Builder/Om/ObjectBuilder.php中,更改以下内容:
if (\$includeForeignObjects) {";
foreach ($fks as $fk) {
$script .= "
if (null !== \$this->" . $this->getFKVarName($fk) . ") {
{$this->addToArrayKeyLookUp($fk->getForeignTable(), false)}
\$result[\$key] = \$this->" . $this->getFKVarName($fk) . "->toArray(\$keyType, \$includeLazyLoadColumns, \$alreadyDumpedObjects, true);
}";
}
foreach ($referrers as $fk) {
if ($fk->isLocalPrimaryKey()) {
$script .= "
if (null !== \$this->" . $this->getPKRefFKVarName($fk) . ") {
{$this->addToArrayKeyLookUp($fk->getTable(), false)}
\$result[\$key] = \$this->" . $this->getPKRefFKVarName($fk) . "->toArray(\$keyType, \$includeLazyLoadColumns, \$alreadyDumpedObjects, true);
}";
} else {
$script .= "
if (null !== \$this->" . $this->getRefFKCollVarName($fk) . ") {
{$this->addToArrayKeyLookUp($fk->getTable(), true)}
\$result[\$key] = \$this->" . $this->getRefFKCollVarName($fk) . "->toArray(null, false, \$keyType, \$includeLazyLoadColumns, \$alreadyDumpedObjects);
}";
}
}
$script .= "
}";至
if (\$includeForeignObjects) {";
foreach ($fks as $fk) {
$script .= "
if (null !== \$this->" . $this->getFKVarName($fk) . ") {
{$this->addToArrayKeyLookUp($fk->getPhpName(), $fk->getForeignTable(), false)}
\$result[\$key] = \$this->" . $this->getFKVarName($fk) . "->toArray(\$keyType, \$includeLazyLoadColumns, \$alreadyDumpedObjects, true);
}";
}
foreach ($referrers as $fk) {
if ($fk->isLocalPrimaryKey()) {
$script .= "
if (null !== \$this->" . $this->getPKRefFKVarName($fk) . ") {
{$this->addToArrayKeyLookUp($fk->getRefPhpName(), $fk->getTable(), false)}
\$result[\$key] = \$this->" . $this->getPKRefFKVarName($fk) . "->toArray(\$keyType, \$includeLazyLoadColumns, \$alreadyDumpedObjects, true);
}";
} else {
$script .= "
if (null !== \$this->" . $this->getRefFKCollVarName($fk) . ") {
{$this->addToArrayKeyLookUp($fk->getRefPhpName(), $fk->getTable(), true)}
\$result[\$key] = \$this->" . $this->getRefFKCollVarName($fk) . "->toArray(null, false, \$keyType, \$includeLazyLoadColumns, \$alreadyDumpedObjects);
}";
}
}
$script .= "
}";此外,还有:
protected function addToArrayKeyLookUp(Table $table, $plural)
{
$phpName = $table->getPhpName();
$camelCaseName = $table->getCamelCaseName();
$fieldName = $table->getName();至:
protected function addToArrayKeyLookUp($phpName, Table $table, $plural)
{
if($phpName == "") {
$phpName = $table->getPhpName();
}
$camelCaseName = $table->getCamelCaseName();
$fieldName = $table->getName();现在,我可以使用PHPNames将多个FKs引用到同一个表中,而不会出现任何问题。
请注意,每次更新Propel时,文件都会更改。
https://stackoverflow.com/questions/33034954
复制相似问题