在控制器中,我有以下代码:publicfunctionactionView($id){$query=newQuery;$query->select('*')->from('table_1t1')->innerJoin('table_2t2','t2.t1_id=t1.id')->innerJoin('table_3t3','t2.t3_id=t3.id')->innerJoin('table_4t4','t3.t4_id=t4.id')->andWhere('t1.id='.$id);$rows=$query->all();return$this->render('view',['model'=>$this->findModel($id),'rows'=>$rows,]);}在视图view.php中显示来自table_2-4的数据与table_1相关:foreach($rowsas$row){echo$row['t2_field_1'];echo$row['2_field_2'];...}它有效,但我不确定这是否是Yii2的最正确方法。我正在尝试在模型TableOne中定义关系:publicfunctiongetTableTwoRecords(){return$this->hasMany(TableTwo::className(),['t1_id'=>'id']);}publicfunctiongetTableThreeRecords(){return$this->hasMany(TableThree::className(),['id'=>'t3_id'])->via('tableTwoRecords');}公共函数getTableFourRecords(){return$this->hasMany(TableFour::className(),['id'=>'t4_id'])->via('tableThreeRecords');}然后添加记录到控制器TableOneController:$records=TableOne::find()->innerJoinWith(['tableTwoRecords'])->innerJoinWith(['tableThreeRecords'])->innerJoinWith(['tableFourRecords'])->all();但它不起作用。如果我只加入前三个表,那么它将起作用。如果我添加第四个表,我会收到以下错误消息:“获取未知属性:frontend\models\TableOne::t3_id”如果我更改函数getTableFourRecords():publicfunctiongetTableFourRecords(){return$this->hasOne(TableThree::className(),['t4_id'=>'id']);}然后我收到此错误消息:“SQLSTATE[42S22]:未找到列:1054Unknowncolumn'table_4.t4_id'in'onclause'正在执行的SQL是:SELECTtable_1.*FROMtable_1INNERJOINtable_2ONtable_1.id=table_2.t1_idINNERJOINtable_3ONtable_2.t3_id=table_3.idINNERJOINtable_4ONtable_1.id=table_4.t4_id"解决方案:模型TableOne:publicfunctiongetTableTwoRecords(){return$this->hasMany(TableTwo::className(),['t1_id'=>'id']);}ModelTableTwo:publicfunctiongetTableThreeRecord(){return$this->hasOne(TableThree::className(),['id'=>'t3_id']);}模型TableThree:publicfunctiongetTableFourRecord(){return$this->hasOne(TableFour::className(),['id'=>'t4_id']);}ControllerTableOneController:publicfunctionactionView($id){return$this->render('view',['model'=>$this->findModel($id),]);}视图table-one/view.php:foreach($model->tableTwoRecordsas$record){echo'表2>>';回声'ID:'。$记录->id;echo'T1ID:'.$记录->t1_id;echo'T3ID:'.$记录->t3_id;echo'表3>>';回声'ID:'。$record->tableThreeRecord->id;echo'T4ID:'.$record->tableThreeRecord->t4_id;echo'表4>>';回声'ID:'。$record->tableThreeRecord->tableFourRecord->id;echo'
';}也可以使用基于GridView的解决方案。模型TableTwo:foreach($model->tableTwoRecordsas$record){echo'表2>>';回声'ID:'。$记录->id;echo'T1ID:'.$记录->t1_id;echo'T3ID:'.$记录->t3_id;echo'表3>>';回声'ID:'。$record->tableThreeRecord->id;echo'T4ID:'.$record->tableThreeRecord->t4_id;echo'表4>>';回声'ID:'。$record->tableThreeRecord->tableFourRecord->id;echo'
';}使用yii为TableTwo模型生成的TableOneController中的actionView数已被编辑:useapp\models\TableTwo;useapp\models\TableTwoSearch;...publicfunctionactionView($id){$searchModel=newTableTwoSearch(['t1_id'=>$id,//数据必须按显示记录的id过滤]);$dataProvider=$searchModel->search(Yii::$app->request->queryParams);返回$this->render('view',['model'=>$this->findModel($id),'searchModel'=>$searchModel,'dataProvider'=>$dataProvider,]);}而views/table-one/view.php的代码如下:echoGridView::widget(['dataProvider'=>$dataProvider,'columns'=>['id','t1_id','tableOneRecord.id','t3_id','tableThreeRecord.id','tableThreeRecord.t4_id','tableFourRecord.id',],]);
