Yii2 — Gii Model Relations — Почему после имен функций стоит 0?

Я не видел этого в Интернете, когда смотрел код другого пользователя, руководства, учебные пособия и т. Д.

Когда я генерирую модель с помощью Gii, все функции, относящиеся к отношениям, имеют после них ноль.


Пример:

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

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

BenefitTypes — это идентификатор сопоставления имен:

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

В таблице «выгод» он имеет столбец с именем «тип», который является отношением к столбцу «идентификатор» таблицы «выгодные типы».

Хотя я должен быть в состоянии (в /views/benefit/index.php) ‘type.name’, но это тоже не работает. Он изменяет имя столбца на «Имя типа» и помещает «(не установлено)» в таблицу данных …

Пример:

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

Что происходит, почему он не действует так, как должен?


Я начинаю думать, что суффикс 0 к именам функций отношения, то есть: getType0, обусловлен тем, что «тип» используется в таблице как имя столбца, чтобы избежать дублирования или путаницы. Я не могу найти это документально, хотя, поэтому хотел бы получить определенный ответ на это.

Я изменил имя функции на getTypeRelation (). Затем в представлении index.php для виджета detailview использовался typeRelation.name, и он возвращал имя через отношение просто отлично.

3

Решение

Ваше мышление правильно. Генерация имен отношений осуществляется функцией 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_id а также delete_user_id связанные с таблицей user приведет к отношениям по имени user, user0 а также user1,

Для вашего примера желательно назвать поле внешнего ключа как-нибудь еще, например type_id или же typeId, Yii справится с этим правильно. Другой вариант, когда у вас есть несколько столбцов, связанных с одной и той же таблицей, это просто переименовать функции.

2

Другие решения

Потому что имя реляционного столбца и имя отношения одно и то же. Когда вы звоните $benefit->type что вы будете ожидать, значение столбца / свойство type или случай BenefitTypes? Итак, теперь вы знаете. $benefit->type вернуть значение свойства и $benefit->type0 возвращает экземпляр отношения.

0

По вопросам рекламы [email protected]