Есть 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
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Можно ли создать переменную с операцией, которая будет идти лишь после переменнойНапример, в HTML коде идет:
У JForm есть множество методов работы с полями и атрибутами полей