getter для ActiveQuery без relation

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

getter для ActiveQuery без relation

Сообщение maxtorchel »

Как сделать getter наподобие:

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

    
    public function getProducts()
    {
        return $this->hasMany(Product::className(), ['catalog_id' => 'id'])->orderBy('position');
    }
 
чтобы можно было работать как с результатом запроса так и с ActiveQuery объектом но без связи, например:

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

    public function getRoots()
    {
        return self::find()->where(['parent_id'=>null])->orderBy('position');
    }
 
здесь получается нужно как-то уточнить одну или несколько записей брать, но при этом не возвращать именно их при обращении к функции, а через grtter возвращать, вобщем по аналогии со связью.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

переформулируйте
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

Re: getter для ActiveQuery без relation

Сообщение maxtorchel »

Ну мне надо чтоб я мог брать записи так:
$this->roots;

Но если мне надо уточнить запрос, то мог сделать так:
$this->getRoots()->andWhere('id!='.$this->id)->all();

На данный момент второе работает а первое нет, надо чтоб работали оба варианта так-же как и со связью products
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

Re: getter для ActiveQuery без relation

Сообщение maxtorchel »

точнее первое отдает только одну запись, получается надо как-то указать что нужен массив записей, limit(null) не работает.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

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

public function getRoots()
    {
        $alias = static::tableName();
        return $this->hasMany(static::class, ['id' => 'parent_id'])->from($alias . ' cu')->andWhere([$alias . '.parent_id'=>null])->orderBy($alias . '.position');
    }
upd: а как у тебя мани рутов?
Последний раз редактировалось lynicidn 2016.01.28, 10:10, всего редактировалось 1 раз.
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

алиасы надо обязательно юзать, т.к. у тебя связи на эту же таблицу
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

Re: getter для ActiveQuery без relation

Сообщение maxtorchel »

lynicidn писал(а):upd: а как у тебя мани рутов?
не понял вопроса
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

ну ты пишешь getRoots, он же 1 должен быть?
даже с нестед сетс мани рутс, у чилда будет 1 рут
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

Re: getter для ActiveQuery без relation

Сообщение maxtorchel »

этот метод должен отдавать замые заглавные деревья безотносительно у какого дитя его вызывать

ps у меня вообще идет так:
$catalog - new Catalog();
$catalog->roots;
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

ну тогда только через $this->getRoots()->all()
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

Re: getter для ActiveQuery без relation

Сообщение maxtorchel »

жаль( было бы удобно
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

ну теоретически этому методу ваще нефиг делать в этой модели ну или статическим его сделать
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

findRoots пусть возвращает вам one() а квери делать для рутс отдельно - не вижу смысла
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

Re: getter для ActiveQuery без relation

Сообщение maxtorchel »

сделал так:

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

    /**
     * @return \yii\db\ActiveQuery
     */
    public function getRootsQuery()
    {
        return self::find()->where(['parent_id'=>null])->orderBy('position');
    }
    /**
     * @return Catalog[]
     */
    public function getRoots()
    {
        return $this->getRootsQuery()->all();
    }
 
может конечно избыточно но никогда не поздно почикать)
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

неплохо было бы кешировать в getRoots
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

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

public function getRoots()
{
    static $roots;
    if (!is_array($roots)) {
        $roots = $this->getRootsQuery()->all();
    }
    return $roots;
}
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

Re: getter для ActiveQuery без relation

Сообщение maxtorchel »

кстати да, а почему именно так а не в приватное свойство?
lynicidn
Сообщения: 2222
Зарегистрирован: 2014.05.24, 15:12

Re: getter для ActiveQuery без relation

Сообщение lynicidn »

maxtorchel писал(а):кстати да, а почему именно так а не в приватное свойство?
пиши в приватное, просто если оно юзается в одном месте только, то зачем оно там?
maxtorchel
Сообщения: 34
Зарегистрирован: 2013.11.19, 16:51

Re: getter для ActiveQuery без relation

Сообщение maxtorchel »

понял, спасибо
Ответить