Связанные коллекции mongodb

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
poshik
Сообщения: 3
Зарегистрирован: 2018.01.20, 01:42

Связанные коллекции mongodb

Сообщение poshik » 2018.01.20, 02:13

Здравствуйте!
Есть БД MongoDB у которой есть коллекции Regions и Cities.
Regions
  • _id : ObjectId
  • id : int
  • title : string
Cities
  • _id : ObjectId
  • id : int
  • title : string
  • region : int
Никак не могу понять как связать поле region коллекции Cities с полем id коллекции Regions

Код: Выделить всё

<?php

namespace app\models;

use yii\mongodb\ActiveRecord;

class City extends ActiveRecord
{
    public static function collectionName()
    {
        return 'cities';
    }

    public function attributes()
    {
        return ['_id', 'id', 'region', 'title'];
    }

    public function getRegion()
    {
        return $this->hasOne(Region::className(), ['id' => 'region']);
    }

}

Код: Выделить всё

<?php

namespace app\models;

use yii\mongodb\ActiveRecord;

class Region extends ActiveRecord
{
    public static function collectionName()
    {
        return 'regions';
    }

    public function attributes()
    {
        return ['_id', 'id', 'title'];
    }
}
Если выполнить код

Код: Выделить всё

$city = City::findOne(['id' => 5]);
var_dump($city);
die();
То получаю:

Код: Выделить всё

object(app\models\City)#95 (8) {
  ["_attributes":"yii\db\BaseActiveRecord":private]=>
  array(4) {
    ["_id"]=>
    object(MongoDB\BSON\ObjectId)#97 (1) {
      ["oid"]=>
      string(24) "531324c7f3ca9d970d7c6b3a"
    }
    ["id"]=>
    int(5)
    ["region"]=>
    int(4)
    ["title"]=>
    string(24) "Название города"
  }
  ["_oldAttributes":"yii\db\BaseActiveRecord":private]=>
  array(4) {
    ["_id"]=>
    object(MongoDB\BSON\ObjectId)#97 (1) {
      ["oid"]=>
      string(24) "531324c7f3ca9d970d7c6b3a"
    }
    ["id"]=>
    int(5)
    ["region"]=>
    int(4)
    ["title"]=>
    string(24) "Название города"
  }
  ["_related":"yii\db\BaseActiveRecord":private]=>
  array(0) {
  }
  ["_errors":"yii\base\Model":private]=>
  NULL
  ["_validators":"yii\base\Model":private]=>
  NULL
  ["_scenario":"yii\base\Model":private]=>
  string(7) "default"
  ["_events":"yii\base\Component":private]=>
  array(0) {
  }
  ["_behaviors":"yii\base\Component":private]=>
  array(0) {
  }
}
Насколько я понимаю вместо ["region"] => int(4) должен быть объект, а не исходное число.
Как следствие в GridView я не могу прописать колонку region.title.
Подскажите пожалуйста что я делаю не так.

Аватара пользователя
ElisDN
Сообщения: 4961
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Связанные коллекции mongodb

Сообщение ElisDN » 2018.01.20, 09:32

В таблице переименуйте поле в region_id.

poshik
Сообщения: 3
Зарегистрирован: 2018.01.20, 01:42

Re: Связанные коллекции mongodb

Сообщение poshik » 2018.01.20, 10:26

ElisDN писал(а):
2018.01.20, 09:32
В таблице переименуйте поле в region_id.
Ничего не изменилось, разве название имеет значение?

Аватара пользователя
ElisDN
Сообщения: 4961
Зарегистрирован: 2012.10.07, 10:24
Контактная информация:

Re: Связанные коллекции mongodb

Сообщение ElisDN » 2018.01.20, 10:53

poshik писал(а):
2018.01.20, 10:26
разве название имеет значение?
Если есть поле region и связь region, то берётся поле.

poshik
Сообщения: 3
Зарегистрирован: 2018.01.20, 01:42

Re: Связанные коллекции mongodb

Сообщение poshik » 2018.01.20, 15:38

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

Ответить