Relation in Yii

Go To StackoverFlow.com

1

I has Status Model

    <?php

/**
 * This is the model class for table "status".
 *
 * The followings are the available columns in table 'status':
 * @property integer $status_id
 * @property string $message
 * @property string $created
 * @property integer $thumbs_up
 * @property integer $thumbs_down
 * @property string $reply
 * @property integer $user_id
 *
 * The followings are the available model relations:
 * @property Comment[] $comments
 * @property User $user
 * @property ThumbUpDown[] $thumbUpDowns
 */
class Status extends CActiveRecord {

    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return Status the static model class
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName() {
        return 'status';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            array('message, created', 'required'),
            array('thumbs_up, thumbs_down, user_id', 'numerical', 'integerOnly' => true),
            array('message', 'length', 'max' => 255),
            array('reply', 'length', 'max' => 45),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('status_id, message, created, thumbs_up, thumbs_down, reply, user_id', 'safe', 'on' => 'search'),
        );
    }

    /**
     * @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(
            'comments' => array(self::HAS_MANY, 'Comment', 'status_id'),
            'user' => array(self::BELONGS_TO, 'Register', 'user_id'),
            'thumbUpDowns' => array(self::HAS_MANY, 'Thumb_up_down', 'status_id'),
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array(
            'status_id' => 'Status',
            'message' => 'Message',
            'created' => 'Created',
            'thumbs_up' => 'Thumbs Up',
            'thumbs_down' => 'Thumbs Down',
            'reply' => 'Reply',
            'user_id' => 'User',
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    public function search() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria = new CDbCriteria;

        $criteria->compare('status_id', $this->status_id);
        $criteria->compare('message', $this->message, true);
        $criteria->compare('created', $this->created, true);
        $criteria->compare('thumbs_up', $this->thumbs_up);
        $criteria->compare('thumbs_down', $this->thumbs_down);
        $criteria->compare('reply', $this->reply, true);
        $criteria->compare('user_id', $this->user_id);

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

    public function getUrl() {
        return Yii::app()->createUrl('status', array(
                    'id' => $this->status_id,
                    'title' => $this->message,
                ));
    }

    public function addComment($comment) {
        $comment->status_id = $this->status_id;
        $comment->user_id = Yii::app()->user->id;
        $comment->created = date('Y-m-d H:i:s');
        return $comment->save();
    }



}

Register Model

    <?php

/**
 * This is the model class for table "user".
 *
 * The followings are the available columns in table 'user':
 * @property integer $user_id
 * @property string $username
 * @property string $password
 * @property string $name_first
 * @property string $name_last
 * @property string $email
 * @property string $picture
 * @property integer $active
 * @property string $created
 */
class Register extends CActiveRecord {

    /**
     * Returns the static model of the specified AR class.
     * @param string $className active record class name.
     * @return Register the static model class
     */
    public static function model($className = __CLASS__) {
        return parent::model($className);
    }

    /**
     * @return string the associated database table name
     */
    public function tableName() {
        return 'user';
    }

    /**
     * @return array validation rules for model attributes.
     */
    public function rules() {
        // NOTE: you should only define rules for those attributes that
        // will receive user inputs.
        return array(
            //array('username, password, name_first, name_last, email, active, created', 'required'),
            array('username, password, name_first, name_last, email', 'required'),
            array('active', 'numerical', 'integerOnly' => true),
            array('username, password, name_first, name_last', 'length', 'max' => 45),
            array('email', 'length', 'max' => 100),
            array('picture', 'length', 'max' => 255),
            // The following rule is used by search().
            // Please remove those attributes that should not be searched.
            array('user_id, username, name_first, name_last, email, active', 'safe', 'on' => 'search'),
        );
    }

    /**
     * @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(
            'friends' => array(self::HAS_MANY, 'Friend', 'user_id'),
            'friendLists' => array(self::HAS_MANY, 'FriendList', 'user_id'),
            'notifications' => array(self::HAS_MANY, 'Notification', 'user_id'),
            'profiles' => array(self::HAS_MANY, 'Profile', 'user_id'),
            'statuses' => array(self::HAS_MANY, 'Status', 'user_id'),
        );
    }

    /**
     * @return array customized attribute labels (name=>label)
     */
    public function attributeLabels() {
        return array(
            'user_id' => 'User',
            'username' => 'Username',
            'password' => 'Password',
            'name_first' => 'Name First',
            'name_last' => 'Name Last',
            'email' => 'Email',
            'picture' => 'Picture',
            'active' => 'Active',
            'created' => 'Created',
        );
    }

    /**
     * Retrieves a list of models based on the current search/filter conditions.
     * @return CActiveDataProvider the data provider that can return the models based on the search/filter conditions.
     */
    public function search() {
        // Warning: Please modify the following code to remove attributes that
        // should not be searched.

        $criteria = new CDbCriteria;

        $criteria->compare('user_id', $this->user_id);
        $criteria->compare('username', $this->username, true);
        //$criteria->compare('password', $this->password, true);
        $criteria->compare('name_first', $this->name_first, true);
        $criteria->compare('name_last', $this->name_last, true);
        $criteria->compare('email', $this->email, true);
        //$criteria->compare('picture', $this->picture, true);
        $criteria->compare('active', $this->active);
        //$criteria->compare('created', $this->created, true);

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

// encrypt password
    public function beforeSave() {
        $this->created = date('Y-m-d H:i:s');
        $this->password = md5($this->password);
        $this->active = 1;
        $this->picture = '';
        return true;
    }

}

I wanna get username of Status by echo $data->user->username but I has a error Trying to get property of non-object at $data->user->username I need your help. Thank for advance!

2012-04-05 16:57
by chanhle


4

Looks like user is an array. Try $data->user['username']

2012-04-05 16:59
by AlienWebguy
Actually, that's not likely. user is a relation, so it will be either an instance of the User class or NULL (unless someone's been messing with addRelatedRecord manually). Which is consistent with the phpdoc annotation for it - DCoder 2012-04-05 19:16
Why user is an array and not an object - sevenWonders 2012-10-17 13:31
This worked for me, but yeah, same question. "Why user is an array and not an object?". I been struggling to find why it is not working - Louie Miranda 2013-07-25 11:28


0

use 'with' property of criteria like this:

$criteria->with = array('user').

Its better than lazy load. Check this http://www.yiiframework.com/doc/guide/1.1/en/database.arr#relational-query-performance. And it will be better if u can give some more code where u use $data->user->username, i gues it's gridview?

2012-04-05 18:07
by Elkan


0

This error (Trying to get property of non-object) mean in the "user" table dont have the record which have id field value equivalent to $data->user_id.

Check the value of $data->user_id and make sure it exist in id field of "user" table.

2012-04-05 19:10
by kamankily
Ensuring userid points to a valid user record is pretty much what db foreign keys are for. (Also, depending on the schema, it's possible that userid is NULL) - DCoder 2012-04-05 19:14


0

Try to change your Status model relation string to this:

'user' => array(self::BELONGS_TO, 'Register', array('user_id' => 'user_id)),

Hope it will help.

2012-04-06 12:43
by Sobit Akhmedov


0

you should be able to use print_r($data) to see inner structure of variable. then you will have opinion on how to use variable.

2012-07-05 18:32
by Halis Yılboğa


0

Hope this could help you

$data["user"]["username"]
2014-12-18 11:13
by Maharjan
Ads