首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Propel -使用多个外键连接同一个表

Propel -使用多个外键连接同一个表
EN

Stack Overflow用户
提问于 2015-10-09 09:43:40
回答 1查看 553关注 0票数 1

我对Propel2 (2.0.0-dev版本)有问题。

我有三个外键指向同一个表:

代码语言:javascript
复制
<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

代码语言:javascript
复制
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,而不用于FromSiteToSite,这随后不允许我使用FromSiteToSite调用对象。

这些表格以下列方式连接:

代码语言:javascript
复制
$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)
  ...

有办法绕道吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-10-15 10:37:58

我们设法解决了上述问题。在Propel/Generator/Builder/Om/ObjectBuilder.php中,更改以下内容:

代码语言:javascript
复制
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 .= "
    }";

代码语言:javascript
复制
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 .= "
    }";

此外,还有:

代码语言:javascript
复制
protected function addToArrayKeyLookUp(Table $table, $plural)
{
    $phpName = $table->getPhpName();
    $camelCaseName = $table->getCamelCaseName();
    $fieldName = $table->getName();

至:

代码语言:javascript
复制
protected function addToArrayKeyLookUp($phpName, Table $table, $plural)
{
    if($phpName == "") {
        $phpName = $table->getPhpName();  
    }

    $camelCaseName = $table->getCamelCaseName();
    $fieldName = $table->getName();

现在,我可以使用PHPNames将多个FKs引用到同一个表中,而不会出现任何问题。

请注意,每次更新Propel时,文件都会更改。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33034954

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档