Yii2.0如何使用AR联表查询

2017-07-14jay 的分享   加三联MM小编微信好友:sanlian2018

第一种是查询构建器(Query Builder),第二种使用活动记录(Active Record),中文网对查询构建器讲的很详细,AR则说的很坑爹,下面贴出自己实践的方法,以供参考。

两个表

{{%article}} 和 {{%article_class}}

{{%article}} .article_class关联{{%article_class}}.id

1、要使用AR做关联查询,首先在models {Article} 中创建关联:


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
class Article extends \yii\db\ActiveRecord
{
  //这里声明被关联字段
  public $class_name;
    
  /**
   * @inheritdoc
   */
  public static function tableName()
  {
    return '{{%article}}';
  }
  ...
 //关联 mysite_article_class 表
  public function getArticleClass(){
    /**
    * 第一个参数为要关联的子表模型类名称,
    * 第二个参数指定通过子表的 id 去关联主表的 article_class 字段
    */
    return $this->hasMany(ArticleClass::className(), ['id' => 'article_class']);
  
    
}

2、在controllers {ArticleController}中使用,


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public function actionIndex()
  {  
    $article = new Article();
    if(Yii::$app->request->get('class')){
      $query = Article::find()
          ->joinWith('articleClass')
          ->select(['{{%article}}.*,{{%article_class}}.class_name'])
          ->where(['article_class' => Yii::$app->request->get('class')]);
      $dataProvider = new ActiveDataProvider([
        'query' => $query,
      ]);
        
    }else{
      $query = Article::find()
          ->joinWith('articleClass')
          ->select(['{{%article}}.*,{{%article_class}}.class_name']);
      $dataProvider = new ActiveDataProvider([
        'query' => $query,
      ]);
        
    }
    return $this->render('index', [
      'dataProvider' => $dataProvider,
      'model' => $article,
    ]);
  }

3、在view {GridView}中使用


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<?= GridView::widget([
  'dataProvider' => $dataProvider,
  'columns' => [
    ['class' => 'yii\grid\SerialColumn'],
    'id',
    //'article_content:ntext',
    [
      'value'=>'class_name',
      'label'=>'文章分类',
    ],
    'article_title',
    'article_addtime:datetime',
    // 'article_updatetime:datetime',
    // 'article_author',
    ['class' => 'yii\grid\ActionColumn'],
  ],
]); ?>

TA发布的帖子

606

收藏

605