yii показывает данные о cgridview из других таблиц

У меня проблема с отображением данных в cgridview с использованием внешних ключей. Это мой случай, у меня есть сотрудник таблицы (идентификатор, имя пользователя), клиент (идентификатор, имя пользователя) и транзакция (идентификатор, идентификатор сотрудника, идентификатор клиента). Внешний ключ employeeId к employee.id, а clientId — внешний ключ к client.id. Теперь я хочу показать имя сотрудника и имя клиента вместо их идентификатора в транзакции admin.php. Это мой код:

class Transaction extends CActiveRecord
{
    public $client_search;
    public $employee_search;

public function rules()
{
    return array(
        .
        .
        .
        array('id, employeeId, clientId, balance, status, date, client_search, employee_search', 'safe', 'on'=>'search'),
    );
}

public function relations()
{
    return array(
        'employee' => array(self::BELONGS_TO, 'Employee', 'employeeId'),
        'client' => array(self::BELONGS_TO, 'Client', 'clientId'),
    );
}

public function search()
{
    $criteria=new CDbCriteria;
    $criteria->with = array( 'client', 'employee' );

    $criteria->together = true;
    $criteria->compare('t.id',$this->id,true);
    $criteria->compare('employee.username', $this->employee_search, true );
    $criteria->compare('client.username', $this->client_search, true );
    $criteria->compare('t.balance',$this->balance,true);
    $criteria->compare('t.status',$this->status);
    $criteria->compare('t.date',$this->date,true);

    return new CActiveDataProvider($this, array(
        'criteria'=>$criteria,
    ));
}

 //the other functions are there, i don't edit it.
}

это моя модель/Transaction.php

<?php $this->widget('zii.widgets.grid.CGridView', array(
'id'=>'transaction-grid',
'dataProvider'=>$model->search(),
'filter'=>$model,
'columns'=>array(
    'id',
    array(
        'header' => 'Employee',
        'name' => 'employee_search',
        'value' => '$data->employee->username',
    ),
    array(
        'header' => 'Client',
        'name' => 'client_search',
        'value' => '$data->client->username',
    ),
    array(
        'class'=>'CButtonColumn',
    ),
),
)); 

это мои представления/транзакция/admin.php. и этот код выдал мне ошибку при попытке получить свойство не-объекта (помечено $data->employee->id). На самом деле мне удалось показать имя сотрудника вместо идентификатора сотрудника, но после этого я использую тот же метод для клиента, и появляется ошибка. кто-нибудь может мне помочь? Мой метод заключается в том, чтобы сделать общедоступным employee_search, добавить правила, добавить отношение, добавить $creiteria->with, затем изменить файл admin.php. Кто-нибудь, пожалуйста, помогите мне.

//ОБНОВЛЕНИЕ РЕШЕНО. На самом деле это моя вина. Ошибка в базе данных об отношении (внешний ключ). Моя кодировка в порядке.


person user3506223    schedule 03.05.2014    source источник
comment
Добавьте как можно больше кода. Контроллер (где вы передаете свою переменную представления $model), например, вероятно, поможет нам.   -  person Felipe    schedule 05.05.2014


Ответы (1)


Трудно догадаться, не имея возможности отлаживать свой код, но вот некоторые вещи, которые могут помочь (я добавлю больше, когда придумаю).

Возможно, это связано с тем, что по умолчанию joinType для отношений равно LEFT OUTER JOIN, и, возможно, у вас есть Transaction, где одно из них равно нулю? Если вы попытаетесь получить доступ к атрибутам нулевого объекта (в отличие от реального объекта ActiveRecord), вы увидите именно это сообщение об ошибке.

Вы можете изменить его, выполнив:

public function relations()
{
    return array(
        'employee' => array(self::BELONGS_TO, 'Employee', 'employeeId',array('joinType'=>'INNER JOIN')),
        'client' => array(self::BELONGS_TO, 'Client', 'clientId',array('joinType'=>'INNER JOIN')),
    );
}

P.S.: INNER JOIN это то же самое, что просто JOIN

Не уверен, что это поможет вам, но попробовать стоит.

Дополнительная информация: http://www.yiiframework.com/doc/api/1.1/CActiveRecord#relations-detail

person Felipe    schedule 05.05.2014
comment
Извините, на самом деле это моя вина. Ошибка в базе данных. Моя кодировка в порядке. Все равно спасибо за помощь. - person user3506223; 05.05.2014