Для работы с двумя разными таблицами в одной Active Record (AR) используя стандартные методы yii, необходимо сделать следующее:
1. Настроить связи между таблицами в БД по внешнему ключу.
2. Для каждой таблицы сделать AR класс-модель (Проще через Gii).
Для реализации поиска и вывода данных через стандартный виджет CGridView понадобится один из AR классов, который будет основным, через него будет работать view с таблицей CGridView.
Назовем этот основной класс AR Users
А второй класс AR – Comments
Если БД настроена верно, то Gii в обоих классах автоматически пропишет связи между таблицами:
В Users он будет выглядеть так:
1 2 3 4 5 6 7 8 9 |
public function relations() { // NOTE: you may need to adjust the relation name and the related // class name for the relations automatically generated below. return array ( 'coms' => array(self::BELONGS_TO, 'Comments', 'comid'), ); } |
'coms'
– это в дальнейшем будет использоваться как путеводитель к данным второй таблицы из класса Comments. Но само название можно выбрать любое.
'Comments'
– это имя класса второй AR с таблицей comments
'comid'
– имя связи между ключами в БД, ставится автоматически, и всегда одинаково в обоих классах.
В методе public function search() класса Users нужно прописать следующее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
public function search() { // Warning: Please modify the following code to remove attributes that // should not be searched. $criteria=new CDbCriteria; $criteria->with = 'coms'; $criteria->compare('id',$this->id); $criteria->compare('name',$this->name); $criteria->compare('coms.header', $this->header, true); $sort = new CSort(); $sort->attributes = array( 'header'=>array( 'asc'=>'coms.header', 'desc'=>'coms.header desc', ), ); $a = new CActiveDataProvider($this, array( 'criteria'=>$criteria, 'sort' => $sort, )); return $a; |
1 2 3 4 |
public function primaryKey() { return array('id_operation','id_tickets'); } |
}
Таким образом мы добавили в поиск данных для CGridView дополнительный параметр header из второй таблицы. Но, чтобы работала сортировка, необходимо в AR Users прописать свойство header – которое есть во второй AR (колонка таблицы второй AR):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
private $_header = null; public function getHeader() { if ($this->_header === null && $this->coms !== null) { $this->_header = $this->coms->header; } return $this->_header; } public function setHeader($value) { $this->_header = $value; } |
Данные методы автоматически добавят свойство header в класс AR Users
Примечание
Если в связующей таблице установлены INDEX, то в модели необходимо прописать эти индексы.
Например:
В модели прописаны связи
1 2 3 4 5 6 7 8 9 10 11 12 |
/** * @return array relational rules. */ public function relations() { // NOTE: you may need to adjust the relation name and the related // class name for the relations automatically generated below. return array( 'idTickets' => array(self::BELONGS_TO, 'Tickets', 'id_tickets'), 'idOperation' => array(self::BELONGS_TO, 'SaleTickets', 'id_operation'), ); } |
В самой таблице установлены INDEX, значит в эту же модель нужно добавить вручную описание индексов:
1 2 3 4 |
public function primaryKey() { return array('id_operation','id_tickets'); } |