расширить CDbCriteria

Предварительное обсуждение найденных ошибок перед отправкой их авторам фреймворка, а также внесение новых предложений.
Ответить
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

расширить CDbCriteria

Сообщение yan »

Приветствую
Столкнулся с тем что есть проблемы для применения расширенного от CDbCriteria класса - в CActiveRecord в двух местах жестко прописано "new CDbCriteria"

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

public function getDbCriteria($createIfNull=true)
    {
        if($this->_c===null)
        {
            if(($c=$this->defaultScope())!==array() || $createIfNull)
                $this->_c=new CDbCriteria($c);
        }
        return $this->_c;
    }
public function resetScope($resetDefault=true)
    {
        if($resetDefault)
            $this->_c=new CDbCriteria();
        else
            $this->_c=null;

        return $this;
    }
Кто как сейчас делает расширение CDbCriteria?
Может быть лучше было бы вынести создание критерия в отдельный метод, чтобы перекрыв его без проблем менять используемый класс или мб вынести название класса в свойство.
Mike
Сообщения: 5
Зарегистрирован: 2013.09.04, 21:04

Re: расширить CDbCriteria

Сообщение Mike »

Доброго времени суток!
Нужно расширить класс CActiveRecord и переопределить в нём методы связанные с CDbCriteria на новые, которые уже и будут инициализировать ваш расширяющий класс CDbCriteria .
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: расширить CDbCriteria

Сообщение yan »

Mike писал(а):Доброго времени суток!
Нужно расширить класс CActiveRecord и переопределить в нём методы связанные с CDbCriteria на новые, которые уже и будут инициализировать ваш расширяющий класс CDbCriteria .
Спасибо, в принципе это был ожидаемый ответ, я так и сделал, но дело в том, что эти методы не очень подходят для переопределения, т.к. в них идет обращение к приватному $this->_c, поэтому получается на мой взгляд кривовато.
Mike
Сообщения: 5
Зарегистрирован: 2013.09.04, 21:04

Re: расширить CDbCriteria

Сообщение Mike »

yan писал(а):
Mike писал(а):Доброго времени суток!
Нужно расширить класс CActiveRecord и переопределить в нём методы связанные с CDbCriteria на новые, которые уже и будут инициализировать ваш расширяющий класс CDbCriteria .
Спасибо, в принципе это был ожидаемый ответ, я так и сделал, но дело в том, что эти методы не очень подходят для переопределения, т.к. в них идет обращение к приватному $this->_c, поэтому получается на мой взгляд кривовато.
Ну, еще есть вариант, переопределить метод создания критерии и добавить в расширяющий класс CActiveRecord приватную переменную для хранения критерии, ну а других вариантов вроде бы действительно нет.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: расширить CDbCriteria

Сообщение slavcodev »

А зачем расширять критерию?
Жду Yii 3!
lancedevnull
Сообщения: 1268
Зарегистрирован: 2013.07.17, 17:37

Re: расширить CDbCriteria

Сообщение lancedevnull »

mc-bear писал(а):А зачем расширять критерию?
:roll: у меня тоже такоц ответ
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: расширить CDbCriteria

Сообщение yan »

lancedevnull писал(а):
mc-bear писал(а):А зачем расширять критерию?
:roll: у меня тоже такоц ответ
вопрос? :)
Чтобы была возможность 1) реализовать отсутствующий в CDbCriteria функционал, не все возможное в SQL там реализовано 2) использовать короткую-удобную-наглядную запись для часто используемых в проекте длинных критериев, например с для работы с датами очень удобно.
Да и вообще я просмотрел за последнее время довольно много открытого кода приложений на Yii - расширение CDbCriteria довольно часто встречается, так что это явно не только мой прихоть, только обычно обходятся подобным

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

$criteria=new DbCriteria();// ...
$criteria->addCoolCriteria();
Model::model()->findAll($criteria);
а проблемы возникают если использовать DbCriteria уже как полноценную замену CDbCriteria.
Аватара пользователя
slavcodev
Сообщения: 3134
Зарегистрирован: 2009.04.02, 21:42
Откуда: Valencia
Контактная информация:

Re: расширить CDbCriteria

Сообщение slavcodev »

Видимо я отстал от жизни. Не разу не видел и не нужно было расширять критерию. Расширить sql, так для этого вроде билдер есть, упростить сложное использование можно через поведения.

Я думаю необходимость расширять критерию, пришла из-за использования критерия в ином месте нежели модели, что я считаю неверным решением.
Жду Yii 3!
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: расширить CDbCriteria

Сообщение Ekstazi »

На самом деле это не является проблемой так как ваш расширенный критерий наследуется от CDbCriteria и мержится к тому что с дефолтным скоупом идет.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: расширить CDbCriteria

Сообщение yan »

Ekstazi писал(а):На самом деле это не является проблемой так как ваш расширенный критерий наследуется от CDbCriteria и мержится к тому что с дефолтным скоупом идет.
да присоединить получится, но вот так например сделать уже нет

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

public function coolScope()
{
    $this->getDbCriteria()->addCoolCriteria();
    return $this;
}
 
т.е. получится тут применяй, тут не применяй - кирпич башка попадет, другой программист придет и будет голову ломать, что за фигня
Последний раз редактировалось yan 2013.09.20, 19:02, всего редактировалось 1 раз.
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: расширить CDbCriteria

Сообщение Ekstazi »

Для таких целей есть setDbCriteria, но, это не совсем хорошая практика.
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: расширить CDbCriteria

Сообщение yan »

Вот так работает вроде бы без сюрпризов, если кто еще решит заняться таким же извращением :) можно вышеприведенные методы перекрыть в наследнике активрекорда таким образом

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

    public function getDbCriteria($createIfNull = true) {
        $criteria = parent::getDbCriteria($createIfNull);
        if (get_class($criteria) === 'CDbCriteria') {
            $criteria = new DbCriteria($criteria->toArray());
            $this->setDbCriteria($criteria);
        }
        return $criteria;
    }

    public function resetScope($resetDefault = true) {
        if ($resetDefault) {
            $c = new DbCriteria();
            $this->setDbCriteria($c);
        }
        else
            $this->setDbCriteria(null);
        return $this;
    }
где DbCriteria расширенный СDbCriteria
Ekstazi
Сообщения: 1428
Зарегистрирован: 2009.08.20, 22:54
Откуда: Молдова, Бельцы
Контактная информация:

Re: расширить CDbCriteria

Сообщение Ekstazi »

Эм, а зачем переопределять resetScope если getDbCriteria и так в случае сброса скоупа сделает свою работу ?
yan
Сообщения: 942
Зарегистрирован: 2011.03.23, 09:28
Откуда: Уфа

Re: расширить CDbCriteria

Сообщение yan »

Ekstazi писал(а):Эм, а зачем переопределять resetScope если getDbCriteria и так в случае сброса скоупа сделает свою работу ?
согласен, перестраховка получается - кроме как через getDbCriteria все равно критерий не используется
Ответить