gpt4 book ai didi

php - Yii2 查询中的数据过滤

转载 作者:可可西里 更新时间:2023-11-01 08:25:10 26 4
gpt4 key购买 nike

在我的 Yii2 项目中,我将 posts 表链接到 categories 表作为多对多关系(posts_categories表)。在我的 Post 模型中,我有 getByCategory($category_id) 函数,它返回该类别的所有帖子。在 Controller 中,我有 actionCategory,我在其中使用此函数并传递特定类别的所有帖子。我在 View 中还有一个 GET 表单,用于通过 GET 参数过滤我的帖子(我需要将此值包含在标题或显示的帖子内容中)。问题是我不知道如何以智能方式将一些过滤功能应用于 Controller 中的 getByCategory 调用。我的功能代码:

public static function getPostsByCategory($category_id = null)
{
$posts = Post::find()
->select('posts.*')
->innerJoin('posts_categories', '`posts`.`id` = `posts_categories`.`post_id`')
->where(['posts_categories.category_id' => $category_id])
->orderBy(['date_create' => SORT_DESC])
->all();
return $posts;
}

Controller Action :

public function actionCategory($id)
{
$posts = Post::getPostsByCategory($id);
return $this->render('index', array('all_posts' => $posts));
}

我所有的想法,比如在 Controller 或模型中使用诸如“如果 $_GET 不为空 - 使用一个查询 - 如果为空 - 另一个”之类的语句看起来确实很乱,并导致在我也需要的其他操作中重复代码我的 $_GET 过滤。你能给我点建议吗?谢谢。

最佳答案

请使用 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方法添加到Post模型:

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;
}
}

在带有搜索功能的 Controller 中

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'));
}

关于php - Yii2 查询中的数据过滤,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37819057/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com