Yii2 - Gii模型关系 - 为什么函数名后面有0?

时间:2015-04-27 03:37:16

标签: php yii2 gii

在查看其他代码,指南,教程等时,我还没有在网上看到这个。

当我使用Gii生成模型时,关于关系的函数在它们之后都为零。

示例:

class Benefit extends \yii\db\ActiveRecord
{
    // truncated Yii Model code...

    public function getType0()
    {
        return $this->hasOne(BenefitTypes::className(), ['id' => 'type']);
    }
}

BenefitTypes是名称映射的id:

id | name
---------------
1  =>  Federal
2  =>  Non-Profit

在'福利'表,它有一个名为' type'的列。这与' benefit_types'有关。 table' id'列。

我虽然应该能够(在/views/benefit/index.php中)' type.name'但它也不起作用。它将列名更改为"类型名称"并放置"(未设置)"在数据表中......

示例:

<?= DetailView::widget([
    'model' => $model,
    'attributes' => [
        'id',
        'somevalue',
        'type.name',
    ],
]) ?>

发生了什么,为什么它不像它应该的那样?

更新

我开始认为关系函数名称的0后缀,即:getType0,是由于&#34; type&#34;在表中用作列名,以避免重复或混淆。但是我无法找到这个文件,所以希望对此有明确的答案。

我将函数名称更改为getTypeRelation()。然后在index.php视图中,对于detailview小部件,使用&#39; typeRelation.name&#39;它通过关系返回了名称。

2 个答案:

答案 0 :(得分:2)

你的想法是正确的。关系名称的生成由函数generateRelationName()完成。

protected function generateRelationName($relations, $table, $key, $multiple)
{
    if (!empty($key) && substr_compare($key, 'id', -2, 2, true) === 0 && strcasecmp($key, 'id')) {
        $key = rtrim(substr($key, 0, -2), '_');
    }
    if ($multiple) {
        $key = Inflector::pluralize($key);
    }
    $name = $rawName = Inflector::id2camel($key, '_');
    $i = 0;
    while (isset($table->columns[lcfirst($name)])) {
        $name = $rawName . ($i++);
    }
    while (isset($relations[$table->fullName][$name])) {
        $name = $rawName . ($i++);
    }
    return $name;
}

Yii使用相关表的名称作为关系名称。如果您有一个与相关表格同名的列,则会在关系中附加一个数字,以避免因Yii处理魔术函数而造成混淆。如果在与同一个表相关的单个表中有两列或更多列,也会出现这种情况,例如与表create_user_id相关的列update_user_iddelete_user_iduser将导致关系名为useruser0user1

对于您的示例,建议您将外键字段命名为其他内容,例如type_idtypeId。 Yii会正确处理这些问题。当您有多个与同一个表相关的列时,另一个替代方法是重命名函数。

答案 1 :(得分:0)

因为关系列名称和关系名称相同。当您致电$benefit->type期望的内容时,列/属性type的值或BenefitTypes的实例?所以现在你知道了。 $benefit->type返回属性值,$benefit->type0返回关系实例。