Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Yii2 model::find() with default where conditions

Tags:

yii2

Using Yii2 in the View...

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

returns all products as array. I'm looking for a way to make it return all products WHERE id != 1 I want to have only one place do modify what "->all()" returns for every model. I know that Product::find()->where('id != 1')->... is possible, but I don't want to write and maintain it in more than one place.

like image 684
Todor Tsvetkov Avatar asked Feb 16 '15 16:02

Todor Tsvetkov


1 Answers

1) You can simply override find() method in your model:

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

Usage:

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

2) Use scope.

Create custom query class:

namespace app\models;

use yii\db\ActiveQuery;

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

        return $this;
    }
}

Override find() method in your model:

namespace app\models;

use yii\db\ActiveRecord;

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

Then you can use it like this:

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

I think using second method is more flexible, because it makes code more clear.

Additional notes:

  • Hardcoded id is not good practice. Better replace it with equivalent condition.

  • For this examples I used different way of specifying condition. See different ways of specifying condition in where statement in official documentation.

like image 196
arogachev Avatar answered Nov 03 '22 23:11

arogachev