Лучший способ сделать это - использовать отношения, реализованные в активной модели.
1) Определить отношения в ваших моделях
Если вы использовали Gii для генерации классов вашей модели из тогда в вашей БД отношения, вероятно, уже определены.
Это должно выглядеть следующим образом
class Option extends \yii\db\ActiveRecord
{
public function getTool()
{
return $this->hasOne(Tool::class, ['id' => 'tool_id']);
}
//... other code of the model
}
Определение отношения в классе модели позволит вам получить доступ к связанной модели как свойству этого объекта. Например, метод, определенный выше, позволит вам сделать что-то вроде $option->tool->tool_name
.
2) Принудительная загрузка для отношения
По умолчанию в отношениях в Yii используется «отложенная загрузка». Это означает, что связанная модель не загружается из БД до тех пор, пока к ней нет доступа в первый раз. Это хорошо, когда вы работаете с одной моделью, потому что вы можете или не можете использовать эту связанную модель. Но если вы собираетесь вывести несколько моделей в таблицу, и каждая из них получит доступ к связанной модели, ленивая загрузка вызовет дополнительный запрос для каждой строки таблицы. Чтобы избежать этого, мы хотим сказать ActiveQuery
, что он должен загружать все связанные модели для нашего отношения tool
при загрузке моделей option
. Это называется «нетерпеливая загрузка». Для этого необходимо использовать метод with()
при создании запроса для поставщика данных.
Например, например:
$query = Option::find()
->with('tool'); //the param is name of relation
3) Добавить столбец из связанной модели в GridView
Теперь вы можете просто добавить столбец из связанной модели как relation.column
, в вашем случае это будет tool.tool_name
.
Пример:
<?= yii\grid\GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => $searchModel,
'columns' => [
'tool.tool_name',
'option_name',
'type',
]
]);