Yii2 model:: find() со значением по умолчанию, где условия

Использование Yii2 в представлении...

Products::find()->asArray()->all()

возвращает все продукты в виде массива. Я ищу способ вернуть все продукты WHERE id!= 1 Я хочу, чтобы только одно место изменяло то, что "- > all()" возвращается для каждой модели. Я знаю, что Product::find()->where('id != 1')->... возможен, но я не хочу писать и поддерживать его в нескольких местах.

Ответ 1

1) Вы можете просто переопределить метод find() в своей модели:

/**
 * @return \yii\db\ActiveQuery
 */
public static function find()
{
    return parent::find()->where(['<>', 'id', 1]);
}

Использование:

$products = Products::find()->all();

2) Используйте scope.

Создайте собственный класс запросов:

namespace app\models;

use yii\db\ActiveQuery;

class ProductQuery extends ActiveQuery
{
    public function withoutFirst()
    {
        $this->andWhere(['<>', 'id', 1]);

        return $this;
    }
}

Переопределить метод find() в вашей модели:

namespace app\models;

use yii\db\ActiveRecord;

class Product extends ActiveRecord
{
    /**
     * @inheritdoc
     * @return ProductQuery
     */
    public static function find()
    {
        return new ProductQuery(get_called_class());
    }
}

Затем вы можете использовать его следующим образом:

$products = Products::find()->withoutFirst()->all();

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

Дополнительные примечания:

  • Hardcoded id не является хорошей практикой. Лучше замените его эквивалентным условием.

  • В этом примере я использовал другой способ задания условия. См. Различные способы задания условия в инструкции where в официальной документации .