Добрый день,
Есть таблица Assets, в которой хранятся ID модели оборудования, поставщика, пользователя и тд.
Нужно вывести таблицу Assets в CgridView так, чтобы вместо ID (vendor, owner, model) было имя (vendor_name, model_name, owner_name) поставщика\юзера или модели, найденное из соответствующей таблицы (Vendor, Owner, Model) по ID.
Также должны быть фильтры search для каждого поля.
Таблицы:
Table Assets:
itemId
vendor (HAS_MANY relations)-> Vendor.vendorId
owner (HAS_MANY relations)-> Owner.ownerId
model (HAS_MANY relations)-> Model.modelId
Table Vendor:
vendorId
vendor_name
Table Owner:
ownerId
owner_name
Table Model
modelId
model_name
Relations in model class:
class Assets extends CActiveRecord
{
public function relations()
{ return array(
'model_rel' => array(self::HAS_MANY, 'Model','','on'=>'model=modelId', 'joinType'=>'INNER JOIN', 'alias'=>'Model'),
'owner_rel' => array(self::HAS_MANY, 'Owner','','on'=>'owner=ownerId', 'joinType'=>'INNER JOIN', 'alias'=>'Owner'),
'vendor_rel' => array(self::HAS_MANY, 'Vendor','','on'=>'vendor=vendorId', 'joinType'=>'INNER JOIN', 'alias'=>Vendor'),
);
}
…..
}
Используя данные relations, мне удалось получить выборку из таблиц только таким образом:
View:
<?php
$db = new CActiveDataProvider(
$model->with('vendor_rel', 'model_rel','owner_rel'
);
$this->widget('zii.widgets.grid.CGridView', array(
'id'=>'assets-grid',
'dataProvider'=>$db,
'filter'=>$model,
'columns'=>array(
'vendor_rel.0.vendor_name',
'owner_rel.0.owner_name',
'model_rel.0.model_name',
….
?>
1. Если указать не ‘vendor_rel.0.vendor_name’, а просто ‘vendor_name’, получаю ругань типа property vendor_name is not defined for model Assets. Хотя вроде бы таблицы должны быть заджоинены…
2. Просто ‘model_rel. model_name’ дает пустой столбец, и, вроде, понятно почему (model_rel возвращает массив и нам нужена 1я строка)
3. Фильтров для полей vendor_name, owner_name и тд я не вижу. Тоже понятно почему, ведь
‘filter’=>$model. Но если сделать ‘filter’=>$db, то получу ругань: CActiveDataProvider does not have a method named “getValidators”…
Возможно я чего-то просто не понимаю, и решение лежит на поверхности.
Подскажите пожалуйста, как я могу заджоинить несколько таблиц, связанных не по PK таблицы Assets, выбрать нужные поля из получившегося результата и иметь фильтры для этих полей (как должна выглядеть ф-ция Search)?
Огромное спасибо