У меня есть две таблицы / модели Компьютер и системная плата
Computer
- со следующими столбцами / полями:
- id
- имя
- mainboard_Id
- serial_number
- ...
Mainboard
- со следующими столбцами / полями:
- id
- name
- type
- serial_number
- ...
Эти модели находятся в отношениях один к одному.
В модели Computer
у меня есть следующий метод:
public function getMainboard() {
return $this->hasOne(Mainboard::className(), ['id' => 'mainboard_id']);
}
Представление содержит следующий GridView:
echo GridView::widget([
'dataProvider' => $dataProvider,
'filterModel' => null,
'columns' => [
'id',
'name',
'mainboard.type',
'serial_number',
],
]);
Моя SearchModel ComputerSearch
выглядит следующим образом:
class ComputerSearch extends Computer {
public $mainboardType;
public function rules() {
return [
// ...
[['mainboardType'], 'safe'],
];
}
public function search($params) {
$query = Computer::find();
$query->innerJoinWith('mainboard'); // Join for andFilterWhere();
$dataProvider = new ActiveDataProvider([
'query' => $query,
]);
$this->load($params);
if (!$this->validate()) {
return $dataProvider;
}
$query->andFilterWhere([Mainboard::tableName() . '.type' => $this->mainboardType]);
return $dataProvider;
}
}
Моя проблема: этот код показывает «(не установлено)» для mainboard.type
, хотя я получаю все данные, когда вставляю построенный запрос в sql и выполняю его вручную. Когда я уберу строку innerJoinWith()
в ComputerSearch
, фильтр больше не будет работать, потому что он, конечно, не может найти столбец type
в dbo.Computer
, но тогда GridView завершен, а поле mainboard.type равно отображается правильно.
Кто-нибудь знает, как я могу отфильтровать для dbo.Mainboard.type
и отобразить его в виде Computer
?