Страница 1 из 1

ModelQuery отключить init при использовании find\finOne

Добавлено: 2021.07.11, 08:19
iamguruman
Доброе утро

столкнулся с ситуацией в моделях в ModelQuery в init() прописаны параметры для инициализации и часто встречаются
в некоторых запросах требуется отключить init()

подскажите, есть ли какая-то возможно при использовании find или findOne отключить init() в ModelQuery ?

Re: ModelQuery отключить init при использовании find\finOne

Добавлено: 2021.07.11, 13:14
rak
init отключить нельзя, но если там условие where, то его можно сбросить(вместо ->andWhere() использовать ->where())
если там какие-то другие параметры, то нужно смотреть. покажите, что там в init

Re: ModelQuery отключить init при использовании find\finOne

Добавлено: 2021.07.15, 07:02
iamguruman
rak писал(а): 2021.07.11, 13:14 init отключить нельзя, но если там условие where, то его можно сбросить(вместо ->andWhere() использовать ->where())
если там какие-то другие параметры, то нужно смотреть. покажите, что там в init
ModelQUery:

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

public function init()
    {
        parent::init(); // TODO: Change the autogenerated stub

        if(aIfHideMarkdel()){
            $this->andWhere(['m_rolls__roll.markdel_by' => null]);
        }
    }
aIfHideMarkdel():

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

function aIfHideMarkdel(){
    if(!Yii::$app->user->isGuest){
        if (Yii::$app->user->identity->deleted_visibility == '1') {
            //$msg_deleted = 'Удаленные отображаются сейчас';

            return false;

        } elseif (Yii::$app->user->identity->deleted_visibility == '0') {
            return true;
            //$msg_deleted = 'Удаленные сейчас скрыты от просмотра';
            //$this->andWhere(['m_merchantdata__berito.markdel_by' => null]);
        }
    }
}

Re: ModelQuery отключить init при использовании find\finOne

Добавлено: 2021.07.15, 14:26
rak
ну в данном случае можно просто использовать ModelQUery::find()->where() вместо andWhere и условие из init сбросится

Re: ModelQuery отключить init при использовании find\finOne

Добавлено: 2021.07.15, 15:21
SiZE
Вам надо не init отключать а логику переписывать. Можно так

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

class ModelQuery extends ActiveQuery
{
    public function markDelByEqNull(bool $addCondition = false)
    {
    	if ($addCondition) {
	   return $this->andWhere(['m_rolls__roll.markdel_by' => null]);
	}
	
	return $this;
    }
}

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

public function actionTest()
{
    $data = Model::find()->markDelByEqNull(!Yii::$app->user->isGuest && !Yii::$app->user->identity->deleted_visibility)->findAll();
}