Логика определения hasMany/hasOne в генераторе моделей

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Логика определения hasMany/hasOne в генераторе моделей

Сообщение Stepan Selyuk »

Приветствую всех!
Я столкнулся с неправильным поведением генератора моделей. Опишу ситуацию.

Есть модель Profile (таблица profiles), есть модель ProfileFinances (таблица profile_finances). У Profile есть PK = ['id'], у ProfileFinances PK = ['profile_id','eps','currency']. Связаны они между собой FK как 'profile_id' (ProfileFinances) => 'id' (Profile).

При генерации моделей я получаю в Profile:

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

public function getFinances()
    {
        return $this->hasOne(ProfileFinances::className(), ['profile_id' => 'id']);
    }
Что не является правильным, так как моделей ProfileFinances может быть много для одного профиля, так как PK содержит больше полей, чем объявленный FK.
Глянул логику генератора и обнаружил следующее:

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

// Add relation for the referenced table
                $hasMany = false;
                foreach ($fks as $key) {
                    if (!in_array($key, $table->primaryKey, true)) {
                        $hasMany = true;
                        break;
                    }
                }
  
То есть логика такая: если какого-либо поля из ключа FK нет в PK главной модели (обрабатываемой, в данном случае ProfileFinances), то ставим hasMany=true. Но логика должна быть обратная же. Если какого-то поля из PK нет в FK, то hasMany=true.

То есть мы можем иметь:
[profiles] id=1
[profile_finances] profile_id=1,eps=natural,currency=usd
[profile_finances] profile_id=1,eps=natural,currency=eur
[profile_finances] profile_id=1,eps=natural,currency=gbp

В Yii-1 при той же конфигурации таблиц связи генерировались корректно.
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Логика определения hasMany/hasOne в генераторе моделей

Сообщение Stepan Selyuk »

Исправил цикл на

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

foreach ($table->primaryKey as $key) {
                    if (!in_array($key, $fks, true)) {
                        $hasMany = true;
                        break;
                    }
                }
 
И генерация связей заработала корректно.
Сначала невидимое, затем видимое. И так у всех программистов :)
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: Логика определения hasMany/hasOne в генераторе моделей

Сообщение lynicidn »

только решение подозрительно с точки логики, как это нет ключа в связных а где же он тогда? и почему мани*?
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Логика определения hasMany/hasOne в генераторе моделей

Сообщение Stepan Selyuk »

Хотел PR сделать, но смотрю в коде на гихабе уже:

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

if (count($table->primaryKey) > count($fks)) {
                    $hasMany = true;
                } else {
                    foreach ($fks as $key) {
                        if (!in_array($key, $table->primaryKey, true)) {
                            $hasMany = true;
                            break;
                        }
                    }
                }
 
Хотя написано код правился 4 дня назад) а я ежедневно composer запускаю обновиться. Где-то глюк.
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Логика определения hasMany/hasOne в генераторе моделей

Сообщение Stepan Selyuk »

lynicidn писал(а):только решение подозрительно с точки логики, как это нет ключа в связных а где же он тогда? и почему мани*?
В PK может быть больше полей, чем в конкретном FK, я пример выше приводил.
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Логика определения hasMany/hasOne в генераторе моделей

Сообщение Stepan Selyuk »

Удалил composer.lock, vendors, .composer,
сделал "composer install" - все скачалось заново, но код все равно с гитхабовским не совпадает. У кого-то есть подобная проблема?
Сначала невидимое, затем видимое. И так у всех программистов :)
Аватара пользователя
Stepan Selyuk
Сообщения: 198
Зарегистрирован: 2010.02.03, 05:51
Откуда: Cyprus, Limassol
Контактная информация:

Re: Логика определения hasMany/hasOne в генераторе моделей

Сообщение Stepan Selyuk »

Дошло почему)
В сomposer.json было:
"yiisoft/yii2-gii" : "*", и "minimum-stability": "beta",
Поставил "yiisoft/yii2-gii" : "dev-master", так как статус beta этому пакету присваивали аж 13 Апреля 2014.
Сначала невидимое, затем видимое. И так у всех программистов :)
Ответить