@v1kee

Почему ActiveRecord не выводит данные из связанной таблицы если имя поля = имени таблицы?

Добрый день!
Имеется 2 таблицы:
город и медцентр: Town и Medical соответственно.
структура:
Medical
id integer primary auto increment
title string
town integer
description string
...
Town
id integer primary auto increment
title string
parent integer (города по областям поэтому нужен парент)

Такой код:
// Модель мед центра
class Medical extends \yii\db\ActiveRecord
{
  ...
    // связь - у одного медцентра может стоять только 1 город в поле town
    public function getTown()
    {
        return $this->hasOne(Town::className(), ['id' => 'town']);
    }
  ...
}

// модель городов
class Town extends \yii\db\ActiveRecord
{
  ...
    // связь - в одном городе может быть несколько медцентров
    public function getMedical()
    {
        return $this->hasMany(Company::className(),['id' => 'town']);
    }
  ...

// подключаем в MedicalSearch модели релейшн
class MedicalSearch extends Medical
{
   ...
    public function search($params)
    {
        // Поиск с городами
        $query = Company::find()->with('town');
    }
   ...

// в отображении views/medical/index
...
<?= GridView::widget([
    'dataProvider' => $dataProvider,
    'filterModel' => $searchModel,
    'columns' => [
        'id',
        'town.title',    // <- вот таким образом показывает в таблице (not-set) (хотя по сути все должно работать)
        'city.title',       // <- а если геттер getTown в модели Medical переименовать в getCity и тут вызывать через 'city.title' то все работает на ура.
        'title',
        'description',
    ],
...

Целый день бился с этой проблемой не мог понять почему делая все по документации никак не хочет работать связь..
То ли я что то делаю не так, то ли - это глюк и в связанных таблицах нельзя называть поле именем связываемой таблицы?
  • Вопрос задан
  • 193 просмотра
Решения вопроса 1
Используйте вызов функции на прямую:
$model->getTown()->one();
Но лучше задать имя связи иное, как пример $model->townR
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@vksee
Добавляйте в имена полей/атрибутов с айдишниками связанных таблиц постфикс _id, и не будет проблем.

структура:
Medical
id integer primary auto increment
title string
town_id integer

class Medical extends \yii\db\ActiveRecord
{
  ...
    // связь - у одного медцентра может стоять только 1 город в поле town
    public function getTown()
    {
        return $this->hasOne(Town::className(), ['id' => 'town_id']);
    }
  ...
}

И тогда:
$medical->town_id - айдишник,
$medical->town - связанный объект типа Town

Ошибка Trying to get property 'name' of non-object ->with() как решить?
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы