The question is also published on StackOverflow: stackoverflow.com/questions/33387126
In a controller I have the following code:
public function actionView($id)
{
$query = new Query;
$query->select('*')
->from('table_1 t1')
->innerJoin('table_2 t2', 't2.t1_id = t1.id')
->innerJoin('table_3 t3', 't2.t3_id = t3.id')
->innerJoin('table_4 t4', 't3.t4_id = t4.id')
->andWhere('t1.id = ' . $id);
$rows = $query->all();
return $this->render('view', [
'model' => $this->findModel($id),
'rows' => $rows,
]);
}
See the db schema: github.com/AntoninSlejska/yii-test/blob/master/example/sql/example-schema.png
In the view view.php are displayed data from tables_2-4, which are related to table_1:
foreach($rows as $row) {
echo $row['t2_field_1'];
echo $row['t2_field_2'];
...
}
See: stackoverflow.com/questions/32480792
and: www.yiiframework.com/doc-2.0/yii-db-query.html
It works, but I’m not sure, if it is the most correct Yii2’s way.
I tried to define the relations in the model TableOne:
public function getTableTwoRecords()
{
return $this->hasMany(TableTwo::className(), ['t1_id' => 'id']);
}
public function getTableThreeRecords()
{
return $this->hasMany(TableThree::className(), ['id' => 't3_id'])
->via('tableTwoRecords');
}
public function getTableFourRecords()
{
return $this->hasMany(TableFour::className(), ['id' => 't4_id'])
->via('tableThreeRecords');
}
and then to join the records in the controller TableOneController:
$records = TableOne::find()
->innerJoinWith(['tableTwoRecords'])
->innerJoinWith(['tableThreeRecords'])
->innerJoinWith(['tableFourRecords'])
->all();
but it doesn’t work. If I join only the first three tables, then it works. If I add the fourth table, then I receive the following error message: “Getting unknown property: frontend\models\TableOne::t3_id”
If I change the function getTableFourRecords() in this way:
public function getTableFourRecords()
{
return $this->hasOne(TableThree::className(), ['t4_id' => 'id']);
}
then I receive this error message: "SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘table_4.t4_id’ in ‘on clause’
The SQL being executed was: SELECT table_1
.* FROM table_1
INNER JOIN table_2
ON table_1
.id
= table_2
.t1_id
INNER JOIN table_3
ON table_2
.t3_id
= table_3
.id
INNER JOIN table_4
ON table_1
.id
= table_4
.t4_id
"