Yii2模型搜索查询

时间:2015-10-02 19:19:23

标签: yii2

如何将条件添加到我的文章模型中,以便slug(来自类别模型)等于$ slug?

这是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 个答案:

答案 0 :(得分:1)

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

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

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

但是,在您的代码中,您偏离了某些最佳做法。我建议如下:

  • 以单数形式(Articlearticle)同时拥有表名和模型类。如果文章有多个类别,则关系可以是复数形式,如getCategories

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

  • 考虑将ActiveQuery类扩展到ArticleQuery并在那里实施条件。然后,您就可以执行Article::find()->joinWith('category')->byCategorySlug('foo')->all()

  • 等操作