Есть 3 таблицы (order, order_delivery, order_types). Для всех созданы модели, для order gridview. В таблице order есть колонка order_number, в таблице order_delivery колонки order_number и order_delivery_code, в таблице order_types колонки delivery_types_code и delivery_types_name. Я могу в модели Order создать функцию public function getType(){
return $this->hasOne(OrderDelivery::className(), ['order_id' => 'order_id']);
} в индексе 'type.order_delivery_code' и вывести коды доставок из order_delivery. Вопрос, как вместо кодов доставок вывести расшифровку из 3 таблицы delivery_types_name?
Upd. Сделал так.
public function getType(){
return $this->hasOne(DeliveryTypes::className(), ['delivery-types_code' => 'order_delivery_code'])
->viaTable('order_delivery', ['order_id' => 'order_id']);
}
Всем спасибо за участие.
Не много не понятно в чем проблема, хочется найти какоето нативное решение что бы не джойнить таблички? Ну как вариант в каждой модели создать статический метод который на вход будет получать id а на выход расшифровку. Но я бы навероне на заморачивался а просто сделал метод в котором бы переджойнил требуемое. как то так
Сам виджет :
<?= GridView::widget([
'dataProvider' => $model->getOrderDelivery(),
'columns' => [
['class' => 'yii\grid\SerialColumn'],
'orderNumber' ,
'deliveryTypesName'
]
]);
?>
Метод выборки и формирование dataProvider
public function getOrderDelivery(){
//Получим поля , свяжем с типом
$query = new Query();
$query->select(['O.order_number orderNumber' ,
'OT.delivery_types_name deliveryTypesName'])
->from(['order O'])
->leftJoin('order_delivery OD', 'OD.order_number = O.order_number')
->leftJoin('order_types OT', 'OT.order_delivery_code = OD.order_delivery_code ');
//получим provider для GridView
$provider = new ActiveDataProvider([
'query' => $query,
'pagination' => [
'pageSize' => 50,
],
'sort' => ['attributes' => ['orderNumber', 'deliveryTypesName']],
]);
return $provider;
}
Данный вопрос легко решается через relations:
Модель Order.php
public function getDelivery(){
return $this->hasOne(OrderDelivery::className(), ['order_number' => 'order_number']);
}
Модель OrderDelivery.php
public function getType(){
return $this->hasOne(OrderTypes::className(), ['delivery_types_code' => 'order_delivery_code']);
}
Далее при подгрузке модели Order во view, вы может получить delivery_types_name c помощью такой переменной:
$model->delivery->type->delivery_types_name
Продвижение своими сайтами как стратегия роста и независимости