【问题标题】:Propel - Joining the same table using multiple foreign keysPropel - 使用多个外键连接同一个表
【发布时间】:2016-01-07 04:57:53
【问题描述】:

我遇到了 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,而不是 SiteFromSite 也是如此。结果,Site 表只为Site 加入,但不为FromSiteToSite 加入,这随后不允许我使用FromSiteToSite 调用对象。

表格按以下方式连接:

$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)
  ...

有没有办法解决这个问题?

【问题讨论】:

    标签: php mysql orm schema propel


    【解决方案1】:

    我们设法解决了上述问题。在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 的 FK 引用到同一个表中。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 1970-01-01
      • 2019-12-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多