2016-07-31 5 views
1

에 대한 I는 일대 다 관계에서 Object2를 참조하는 객체, Object1,이 하나 Object1 많은 Object2에 있습니다.Yii2 :의 GridView 일대 관계형 데이터

Object1보기에서 관련 Object2yii\grid\GridView 항목 만 포함하려고합니다. Object1 데이터 이외에는 없습니다. GridViewObject2 항목 만 있습니다. 아래 같은 코드를 사용

는, 내가 내 컨트롤러에서 모두 $dataProvider$searchModel을 설정해야합니다 생각하지만 난 $idYii::$app->request->queryParams을 연결하는 방법을 모르겠어요.

내 코드는 Object2 항목을 반환합니다. Object1과의 관계에 관계없이 완벽한 검색 기능을 제공하지만 내가 찾고있는 것은 아닙니다.

이 방법이 올바른지 확신 할 수 없습니다. 누구든지 해결책을 알고 있습니까? 미리 감사드립니다.

/* Object1 model */ 
public function getRelations() { 
    return $this->hasMany(Object2::className(), ['relation' => 'id']); 
} 

/* Object1 view */ 
<?= GridView::widget([ 
    'dataProvider' => $dataProvider, 
    'filterModel' => $searchModel, 
    'columns' => [ 
     ['class' => 'yii\grid\SerialColumn'], 
     'id', 
     'attr1', 
     'attr2', 
     'attr3', 
     'attr4', 
     ['class' => 'yii\grid\ActionColumn'], 
    ], 
]); 

/* Object1 controller */ 
public function actionView($id){ 
    $searchModel = new Object2Search(); 
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

    return $this->render('view', [ 
     'model' => $this->findModel($id), 
     'searchModel' => $searchModel, 
     'dataProvider' => $dataProvider, 
    ]); 
} 
+0

gridview에 무엇을 표시 하시겠습니까? – yafater

+0

'Object'의 속성으로,'relation' 속성은 현재 뷰에서보고있는'Object1'의'id'입니다. –

+0

object1의 모든 오브젝트에는 object2의 오브젝트가 여러 개 있습니다. 관계를 가져올 수 있으며 foreach를 사용하여 표시 할 수 있습니다. – yafater

답변

1

자세히보기에서 GridView를 렌더링하는 대신 다른 방법을 제안 할 수 있습니다.

Object1Object2 항목에 대해 별도의 일반 GridView 위젯을 만듭니다.

GridView 관련 항목에 대한 추가 링크가 있습니다. 나는 이미 그것을 here를 설명하지만, 나는 또한 더 나은 이해를 위해 여기에 코드를 포함 :

[ 
    'class' => 'yii\grid\ActionColumn', 
    'template' => '{objects2} {view} {update} {delete}', 
    'buttons' => [ 
     'objects2' => function ($url, $model, $key) { 
      /* @var $model common\models\Object1 */ 
      return Html::a(
       '<span class="glyphicon glyphicon-arrow-down"></span>', 
       ['objects2/index', 'object1_id' => $model->id], 
       [ 
        'title' => 'Objects 2', 
        'aria-label' => 'Objects 2', 
        'data-pjax' => '0', 
       ] 
      ); 
     },   
    ], 
], 
Object2Controller

수정 index 조치가 추가 매개 변수 (개체 1 ID)를 받아 들일 수 :

/** 
* @param integer $object1_id 
* @return string 
* @throws \yii\web\NotFoundHttpException 
*/ 
public function actionIndex($object1_id) 
{ 
    $searchModel = new Object2Search; 
    $dataProvider = $searchModel->search(Yii::$app->request->queryParams); 

    return $this->render('index', [ 
     'searchModel' => $searchModel, 
     'dataProvider' => $dataProvider, 
    ]); 
} 

search() 방법 Object2Search의해야 추가 매개 변수도 처리 :

/** 
* @param array $params 
* @return ActiveDataProvider 
*/ 
public function search($params) 
{ 
    $query = Object2::find()->where(['object1_id' => $params['object1_id']]); 

    $dataProvider = new ActiveDataProvider([ 
     'query' => $query,    
    ]); 

    if (!($this->load($params) && $this->validate())) { 
     return $dataProvider; 
    } 

    // Additional filters 

    return $dataProvider; 
} 

object1_idrules()에 넣고 추가 필터를 포함하십시오.

Object2 항목의 표시는 object1_id 열을 제외하면 완료됩니다.

분명히 더 많이 맞춤 설정할 수 있습니다. 단지 기본적인 예일뿐입니다.

이 접근법의 가장 큰 장점은 다른 유형의 모델에 대한 코드가 분리되어 유지 관리하기 쉽다는 것입니다.

제가 상술 한 바와 같이 상세보기에서 사용 된 바와 같이, object1_id 의해 초기 필터를 적용 search() 방법 모델 Object2Search의 수정되지만 (이 경우 view 작용에서 유래) 쿼리 PARAMS에서 id 파라미터 건네

$query = Object2::find()->where(['object1_id' => $params['id']]); 

더 나은 조회 구성을 위해 GridView에 부분을 사용하십시오.

+0

이것은 내 질문에 대답하지 않습니다. –

+0

@MrGoobri 나는 대답을 더 많은 정보로 업데이트했다. – arogachev

+0

답변 해 주셔서 감사합니다. 그러나 아이콘을 클릭하면 관련된 모든 데이터가 표시된 모든 Object1 데이터가 표시됩니다. 이것은 내가 묻는 질문이 아니다. –