Yii2 - назначить условие «исправить» - PullRequest
0 голосов
/ 01 июля 2018

Я создаю приложение, в котором в аккаунте может быть много сервисов, вся информация связана с сервисом. Например:

У учетной записи A есть 3 службы, и у каждой службы есть страницы.

Во избежание того, чтобы кто-то изменил service_id при сохранении страницы, на данный момент я делаю:

if(Yii::$app->request->isPost) {

    $post = Yii::$app->request->post();
    $model->load($post);
    $model->service_id = $this->service->id;
}

Где $ model-> service_id = $ this-> service-> id помогает мне назначить выбранный service_id после загрузки таблицы в модель и избежать того, чтобы кто-то отправлял service_id из формы.

Но если в будущем кто-то разработает «документы», я бы хотел, чтобы разработчик не обрабатывал этот service_id для всех запросов.

Итак, сначала я подумал, что смогу попробовать:

public function beforeFind($queryData) {
    parent::beforeFind();
    $queryData['conditions'] = array('service_id' => 2);    
    return $queryData;
}

Но разработчик все еще нуждается в его реализации. Так что, может быть, есть способ создать модель «BaseService», из которой должны расширяться все другие модели, связанные со службами, но не знаете, как:

  1. Добавить условие из родительской модели?
  2. Как передать идентификатор этой модели, чтобы он сохранялся во всех запросах?

Может быть, есть простое решение, и я слишком усложняюсь из-за долгих часов работы, не уверен.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

для повторного использования таких фильтров вы можете поместить их в пользовательский ActiveQuery .

в вашей ActiveRecord:

public static function find() {
    return (new ActiveQuery(get_called_class()));
}

ActiveQuery:

public function service($service = 2) {
    return $this->andWhere(['service_id' => $service]);
}

ваша модель на основе вашей ActiveRecord:

public static function find() {
    return (new ActiveQuery(get_called_class()))->service(2);
}

альтернативно

$model->find()->service(1);

также, этот может представлять интерес (установка значений по умолчанию для сценария)

0 голосов
/ 01 июля 2018

Это условие по умолчанию, применяемое ко всем запросам. Если ваше приложение основано на ActiveRecord классах (не выполняющих прямые запросы SQL или на лету QueryBuilder ) , вы можете просто переопределить find() метод внутри вашего класса Model:

public static function find()
{
    /* you can add more dynamic logic here */
    return parent::find()->where(['service_id' => 2]);
}

По умолчанию все контроллеры в Yii2 используют Model::find() для извлечения данных из базы данных, добавление такого условия должно быть достаточным, чтобы не получить ничего с service_id, отличным от 2. Прямые запросы HTTP GET по идентификатору должны вывести 404 если это условие не выполняется, и получение их в виде реляционных данных в другом классе модели должно вернуть отфильтрованный массив.

ВАЖНО: Чтобы не нарушать эту реализацию, вам необходимо:

  1. Всегда используйте ActiveRecord . В противном случае вам нужно будет вручную добавить условие в ваши запросы.

  2. (Это не правильно) Будьте внимательны, когда использовать asArray () , поскольку в нем отсутствуют функции ActiveRecord (см. примечание и объяснение здесь ) . В противном случае вам необходимо вручную повторно объявить условие, например: Account::find()->where(['service_id' => 2])->asArray()->all();

  3. Всегда используйте иWhere () для объединения условий, потому что , где () переопределяет / игнорирует значение по умолчанию. Пример: Account::find()->andWhere('age>30')->all();

...