Небольшое улучшение для UniqueValidator

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
Аватара пользователя
Cacatuidae
Сообщения: 65
Зарегистрирован: 2017.01.08, 17:39

Небольшое улучшение для UniqueValidator

Сообщение Cacatuidae »

Предлагаю обновить данный участок кода https://github.com/yiisoft/yii2/blob/ma ... r.php#L167
чем-то вроде таким:

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

                // only select primary key to optimize query
                $select = $targetClass::primaryKey()[0];
                if(method_exists($targetClass, 'tableName'))
                    $select = $targetClass::tableName() . '.' . $select;
                $query->select($select);
Это позволит избежать ошибки "Column 'id' in field list is ambiguous" при дополнительном фильтре с жоином
:?
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Небольшое улучшение для UniqueValidator

Сообщение Onotole »

Если вы ловите такую ошибку, то явно указываете в фильтре связь. Так и указывайте в фильтре алиас
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Небольшое улучшение для UniqueValidator

Сообщение Loveorigami »

а если в primaryKey - массив, т.е. составной ключ?
Onotole
Сообщения: 1808
Зарегистрирован: 2012.12.24, 12:49

Re: Небольшое улучшение для UniqueValidator

Сообщение Onotole »

Loveorigami писал(а): 2017.03.01, 22:56 а если в primaryKey - массив, т.е. составной ключ?
Составной из разных таблиц?
Loveorigami
Сообщения: 977
Зарегистрирован: 2014.08.27, 21:54

Re: Небольшое улучшение для UniqueValidator

Сообщение Loveorigami »

из одной.
ТС избегает ошибки Column 'id' in field list is ambiguous
А ключ может быть

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

    /**
     * @return array
     */
    public static function primaryKey()
    {
        return ['post_id', 'tag_id'];
    }
и что даст $select = $targetClass::primaryKey()[0]? - post_id
Аватара пользователя
Cacatuidae
Сообщения: 65
Зарегистрирован: 2017.01.08, 17:39

Re: Небольшое улучшение для UniqueValidator

Сообщение Cacatuidae »

Onotole писал(а): 2017.03.01, 22:23 Если вы ловите такую ошибку, то явно указываете в фильтре связь. Так и указывайте в фильтре алиас
Что-то не пойму ваше предложение использовать алис для селекта, оно ведь не сработает, т.к. задается в валидаторе.
Для самого запроса у меня и так используется алиас:

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

        ...
        $t1 = self::tableName();
        $t2 = MenuItems::tableName();
        $this->uniqueSlugFilterClosure = function(Query $query) use($root_name, $t1, $t2) {
            $query->innerJoin([$t2 => $t2], "{$t2}.instance_id = {$t1}.id");
            $query->andWhere(["{$t2}.root_name" => $root_name]);
        }
        ...
Loveorigami писал(а): 2017.03.02, 09:37 и что даст $select = $targetClass::primaryKey()[0]? - post_id
Согласен. Скорее тут такой допил нужен:

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

                // only select primary key to optimize query
                $select = $targetClass::primaryKey();
                if(method_exists($targetClass, 'tableName')) {
                    $alias = $targetClass::tableName() . '.';
                    $select = array_map(function($pk) use($alias) {return $alias.$pk;}, $select);
                }
                $query->select($select);
Аватара пользователя
Cacatuidae
Сообщения: 65
Зарегистрирован: 2017.01.08, 17:39

Re: Небольшое улучшение для UniqueValidator

Сообщение Cacatuidae »

Для себя пока вопрос решил автопатчингом с помощью composer -> post-update-cmd
Ответить