请使用db查询使用ActiveQuery。这很简单,更有效。
为您简单的,创建类
class PostQuery extends \yii\db\ActiveQuery
{
public function byCategory($id){
$junction_table = '{{%posts_categories}}';
$this
->innerJoin($junction_table, Post::tableName()'.id='.$junction_table.'.post_id')
->where([$junction_table.'.category_id' => $id]);
}
public function orderByDateCreated($sort_type = SORT_DESC){
return $this
->orderBy(['date_create' => $sort_type]);
}
/**
* @inheritdoc
* @return Post[]|array
*/
public function all($db = null)
{
return parent::all($db);
}
/**
* @inheritdoc
* @return Post|array|null
*/
public function one($db = null)
{
return parent::one($db);
}
}
添加find tethod到桩模型:
public static function find()
{
return new PostQuery(get_called_class());
}
对于搜索和过滤器使用PostSearch模式,从Post模型扩展。
class PostSearch extends Post
{
public $category_id;
public function rules(){
return [
['category_id', 'integer']
];
}
public function search($params = []){
$query = Post::find();
$query
->orderByDateCreated();
$dataProvider = new ActiveDataProvider([
'query' => $query
]);
if(!($this->load($params) && $this->validate())){
return $dataProvider;
}
if($this->category_id)
$query->byCategory($this->category_id)
return $dataProvider;
}
}
在动作控制器与搜索
public function actionIndex(){
$searchModel = new ArticleSearch();
$dataProvider = $searchModel->search(\Yii::$app->request->post()); //data from filter form
return $this->render('index', compact('dataProvider'));
}
没有ActiveDataProvider
public function actionIndex(){
$searchModel = new ArticleSearch();
$query = Post::find();
$query
->orderByDateCreated();
if($searchModel->load(\Yii::$app->request->post()) && $searchModel->validate()){
if($this->category_id)
$query->byCategory($this->category_id)
}
$posts = $query->all();
return $this->render('index', compact('posts'));
}