2015-10-02 148 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()之類的操作。