2015-10-02 111 views
1

如何将条件添加到我的Articles模型中,以使slug(来自类别模型)等于$ slug?Yii2模型搜索查询

这是GII生成的功能:

public function getCategory() 
{ 
    return $this->hasOne(Categories::className(), ['id' => 'category_id']); 
} 

这里是我的代码:

public function specificItems($slug) 
    { 
    $query = Articles::find()->with('category'); 
    $countQuery = clone $query; 
    $pages = new Pagination(['totalCount' => $countQuery->count(),'pageSize' => 12]); 
    $articles = $query->offset($pages->offset) 
     ->limit($pages->limit) 
     ->all(); 
    return ['articles' => $articles,'pages' => $pages]; 
    } 

回答

1

你的SQL查询应该包含来自文章和类别表列。为此,您需要使用joinWith()

$result = Articles::find() 
    ->joinWith('category') 
    ->andWhere(['category.slug' => $slug]) 
    ->all(); 

其中'category'是您的类别表的名称。

但是,在您的代码中,您偏离了某些最佳实践。我想提出以下建议:

  • 有奇异两表名和模型类(Articlearticle)。关系可以是复数形式,如果文章有多个类别,则为getCategories

  • 避免返回结果集的函数。更好地返回ActiveQuery类。如果您有查询对象,则只需要获得实际模型->all()即可。但是,您可以进一步操纵此对象,添加更多条件,更改结果格式(->asArray())和其他有用的东西。返回结果数组不允许。

  • 考虑将ActiveQuery课程延伸到ArticleQuery并在那里实施条件。然后,您可以执行诸如Article::find()->joinWith('category')->byCategorySlug('foo')->all()之类的操作。