This is how i do before query on Yii 2.0
(or you can use my extension here : yii2-before-query)
1. Base Trait Before Query ¶
namespace common\traits\base;
trait BeforeQueryTrait{
public static function find() {
$obj = new static;
$class = new \ReflectionClass($obj);
$condition = [];
foreach ($class->getProperties(\ReflectionProperty::IS_STATIC) as $property) {
if(strpos($property->getName(),'BEFORE_QUERY') !== false && is_array($property->getValue($obj))){
$condition = array_merge($condition, $property->getValue($obj));
}
}
return parent::find()->andFilterWhere($condition);
}
}
2. Add new property on model ¶
Next, you can add new property on your model like this :
class MyClass extends \yii\db\ActiveRecord{
use \common\traits\base\BeforeQueryTrait;
public static $BEFORE_QUERY = ['myColumn' => 'myValue'];
}
3. You can create a new trait. ¶
For example, i've created Soft Delete Boolean Trait :
trait SoftDeleteBoolTrait{
public static $BEFORE_QUERY_SOFT_DELETE = ['isdeleted' => 0];
public function deleteSoft() {
$col = key(static::$BEFORE_QUERY_SOFT_DELETE);
$this->{$col} = 1;
return $this->save(false,[$col]);
}
public static function restore($id) {
$col = key(static::$BEFORE_QUERY_SOFT_DELETE);
$model = parent::findOne($id, 1);
$model->{$col} = 0;
$model->save(false,[$col]);
}
}
Use it on model :
class MyClass extends \yii\db\ActiveRecord{
use \common\traits\base\BeforeQueryTrait;
use \common\traits\SoftDeleteBoolTrait;
}
improvement
Re : Improvement @once
If you have any questions, please ask in the forum instead.
Signup or Login in order to comment.