Я не видел этого в Интернете, когда смотрел код другого пользователя, руководства, учебные пособия и т. Д.
Когда я генерирую модель с помощью 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, и он возвращал имя через отношение просто отлично.
Ваше мышление правильно. Генерация имен отношений осуществляется функцией 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 справится с этим правильно. Другой вариант, когда у вас есть несколько столбцов, связанных с одной и той же таблицей, это просто переименовать функции.
Потому что имя реляционного столбца и имя отношения одно и то же. Когда вы звоните $benefit->type
что вы будете ожидать, значение столбца / свойство type
или случай BenefitTypes
? Итак, теперь вы знаете. $benefit->type
вернуть значение свойства и $benefit->type0
возвращает экземпляр отношения.