Shumaila Khan
Shumaila Khan

Reputation: 89

View another attribute of related table - yii

I want to display country name instead of country id in user profile view( country id is FK in user profile tbl) .

anyone can help me with this ?

This is my view controller/action in which I have Country model as well:

public function actionView($id) 
            {

        $model = new TblUserProfile;

        $model = TblUserProfile::model()->find('user_id=:user_id', array(':user_id' => $id));


      $countrymodel =  new Country;

       $countrymodel = Country::model()->findAll();
//       var_dump($countrymodel->name);
//       die();
        $this->render('view', array(
            'model' => $model ,
            'country' =>$countrymodel

        ));
    }

This is my view

<div class="view">

    <b><?php echo CHtml::encode($data->getAttributeLabel('id')); ?>:</b>
       <?php echo CHtml::link(CHtml::encode($data->id), array('view', 'id'=>$data->id)); ?>

    <br />

    <b><?php echo CHtml::encode($data->getAttributeLabel('user_id')); ?>:</b>
    <?php echo CHtml::encode($data->user_id); ?>
    <br />


    <b><?php echo CHtml::encode($data->getAttributeLabel('user_occuption')); ?>:</b>
    <?php echo CHtml::encode($data->user_occuption); ?>

    <br />
    <b><?php

     // $model = TblUserProfile::model()->find('country_id=:country_id', array(':user_id' => $id));


//echo CHtml::encode($model->getAttributeLabel('country')); ?>:</b>
    <?php// echo CHtml::encode($model->name);

        ?>

    <br />

</div>

Now I want to display country name in above view.

These are the relationships of country and user profile table

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(
            'user' => array(self::BELONGS_TO, 'TblUser', 'user_id'),
            'country' => array(self::BELONGS_TO, 'country', 'country_id'),
            'state' => array(self::BELONGS_TO, 'state', 'state_id'),
            'city' => array(self::BELONGS_TO, 'city', 'city_id')

        );
    }

Upvotes: 0

Views: 4848

Answers (3)

Bhatt Akshay
Bhatt Akshay

Reputation: 159

You can also follow this below answer: Just put the below code in your view.php file

            [
                "attribute"=>"User_Country_Id",
                'value' =>$model->country->conName ,
            ],
            [
                "attribute"=>"User_State_Id",
                'value' =>$model->states->stsName ,
            ],
            [
                "attribute"=>"User_City_Id",
                'value' =>$model->cities->ctName ,
            ],

Upvotes: 0

Marian Zburlea
Marian Zburlea

Reputation: 9427

I would use:

$model = TblUserProfile::model()->with('country')->find('user_id=:user_id', array(':user_id' => $id));

with('country') explained: the string country comes from the array relations key.

Then to display in the view you would use:

$model->country->CountryName;
  • $model contains
  • country contains a "model" of country joined by the relation foreign key
  • CountryName is the column name in the Country table

This is the recommended way to do it in the MVC way. Both my example and the one above work, but the one above has more process/logic decisions in the view, which breaks the concept of MVC where the Model should be the fat one and contain all logic/processing possible, then controller will pull this data and provide it to the view.

Upvotes: 2

bool.dev
bool.dev

Reputation: 17478

Use the following code:

<b><?php echo CHtml::encode($data->country->getAttributeLabel('name')); ?>:</b>
<?php echo CHtml::encode($data->country->name); ?>
<br />

Provided that in your country model, the country name column is name.

Since the relation is in place we can use it to access the related country for each user.

In detailview it'll change to:

// instead of 'country_id'
array(
    'name'=>'country_id',
    'value'=>$model->country->name
)

Read the CDetailView doc to see how you can change even more things.

Upvotes: 3

Related Questions