У меня относительно простая установка с использованием приложения Yii, но я пытаюсь получить доступ к данным между таблицами в следующем сценарии:
Два стола:
payments_info (id, data)
: где id — первичный ключ автоинкремента, имя класса модели PaymentInfo
payments (id, payment_id, other_columns)
: здесь id снова является первичным ключом, а payment_id — внешним ключом, указывающим на одну из записей в таблице payment_info, имя класса модели Payment
В массиве отношений внутри класса Модель оплаты у меня есть следующее:
'payment_id'=>array(self::BELONGS_TO, 'PaymentInfo', 'id'),
Я ничего не добавил в отношения модели PaymentInfo, поскольку технически он ничего не знает о другой таблице.
У меня есть контроллер, создающий CActiveDataProvider из модели платежей и показывающий все записи. В нем я хотел бы иметь поле, в котором будет отображаться столбец «данные» из модели PaymentInfo, но я не знаю, как туда добраться.
В cdbcriteria в контроллере, который использовался для создания провайдера данных, я пытался использовать:
$criteria->with = array('payment_id');
И затем в представлении, внутри переменной столбцов CGridView, которая отображает поставщика данных, который я добавил:
array(
'name'=>'payment_id',
'visible'=>true,
'value'=> $data->payment_id->data,
),
Я также пробовал разные комбинации добавления ‘или’ вокруг переменной $ data, но пока безуспешно. Мне удается отобразить правильный payment_id, но я не могу понять, как отобразить значение ‘data’ из другой таблицы. Любые советы приветствуются!
Вы можете использовать метод ниже, чтобы получить данные из другой реляционной таблицы в YII
Модель оплаты в функции отношения
public function relations()
{
return array(
'pinfos' => array(self::BELONGS_TO, 'PaymentInfo', 'payment_id'),
);
}
Модель PaymentInfo в функции отношения
public function relations()
{
return array(
'payments' => array(self::HAS_MANY, 'Payment', 'payment_id'),
);
}
А в zii.widgets.grid.CGridView это
<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'post-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
'pinfos.data',
/* other fields goes here*/
array(
'class'=>'CButtonColumn',
),
),
)); ?>
Больше не нужно ничего делать.
Других решений пока нет …