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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With