active record relation frage

Hey Leute,

ich habe da gerade so ein kleines Problem mit active record, ich habe 2 tabellen erstellt:

1-> DUser (id, username usw.)

2-> DCustomerCompany (id, user_id, name usw.)

wenn ich jetzt nach der Company suche:





public function loadModel($id)

	{

		$model=DCustomerCompany::model()->findByPk($id);

		if($model===null)

			throw new CHttpException(404,'The requested page does not exist.');

		return $model;

	}

}




dann bekomme ich zwar die Company, aber das UserObject ist nicht das was in der Datenbank als user_id drin steht, in diesem fall bekomme ich die Id 3 für den User obwohl in der Company die Id 71 steht…

Ist da vielleicht was mit den relationen falsch?

Hier mal die Models:

DCustomerCompany.php:





<?php


/**

 * This is the model class for table "d_customer_company".

 *

 * The followings are the available columns in table 'd_customer_company':

 * @property string $id

 * @property string $user_id

 * @property string $contact

 * @property string $name

 */

class DCustomerCompany extends CActiveRecord

{

	/**

	 * Returns the static model of the specified AR class.

	 * @param string $className active record class name.

	 * @return DCustomerCompany 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 'd_customer_company';

	}


	/**

	 * @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('user_id', 'length', 'max'=>11),

			array('contact, name', 'length', 'max'=>255),

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('id, user_id, contact, name', '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(

				'user'=>array(self::BELONGS_TO, 'DUser', 'id')

		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'contact' => 'Ansprechpartner',

			'name' => 'Firmenname',

		);

	}


	/**

	 * 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('id',$this->id,true);

		$criteria->compare('contact',$this->contact,true);

		$criteria->compare('name',$this->name,true);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}

}




DUser.php:





<?php


/**

 * This is the model class for table "d_user".

 *

 * The followings are the available columns in table 'd_user':

 * @property integer $id

 * @property string $username

 * @property string $password

 * @property string $email

 * @property string $name

 * @property string $surname

 * @property string $weblink

 * @property string $updated_at

 * @property string $role

 */

class DUser extends CActiveRecord

{

	/**

	 * Returns the static model of the specified AR class.

	 * @param string $className active record class name.

	 * @return DUser 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 'd_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, email', 'length', 'max'=>128),

			array('name, surname, weblink, role', 'length', 'max'=>255),

			// The following rule is used by search().

			// Please remove those attributes that should not be searched.

			array('id, username, password, email, name, surname, weblink, updated_at, role', '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(	

		);

	}


	/**

	 * @return array customized attribute labels (name=>label)

	 */

	public function attributeLabels()

	{

		return array(

			'id' => 'ID',

			'username' => 'Benutzername',

			'password' => 'Passwort',

			'email' => 'Emailadresse',

			'name' => 'Vorname',

			'surname' => 'Familienname',

			'weblink' => 'Weblink',

			'updated_at' => 'Zuletzt bearbeitet',

			'role' => 'Role',

		);

	}


	/**

	 * 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('id',$this->id);

		$criteria->compare('username',$this->username,true);

		$criteria->compare('password',$this->password,true);

		$criteria->compare('email',$this->email,true);

		$criteria->compare('name',$this->name,true);

		$criteria->compare('surname',$this->surname,true);

		$criteria->compare('weblink',$this->weblink,true);

		$criteria->compare('updated_at',$this->updated_at,true);

		$criteria->compare('role',$this->role,true);


		return new CActiveDataProvider($this, array(

			'criteria'=>$criteria,

		));

	}

}




Wäre klasse wenn mir jemand sagen könnte was falsch läuft.

Danke im Vorraus!

-Seb

Was meiner Meinung nach fehlt, ist die Deklaration der Beziehung in der DUser Klasse:




/**

* @return array relational rules.

*/

public function relations()

{

    // vorausgesetzt das ein DUser nur genau einer DCustomerCompany zugeordnet werden kann

    return array(

        'company'=>array(self::HAS_ONE, 'DCustomerCompany', 'user_id'),

    );

}



Edit: Die eben beschriebene Beziehung brauchst du glaube ich nur wenn du vom User aus die Companies abfragen willst.

Edit:

Bei nochmaligen überfliegen des guides hab ich dein Problem glaube ich gefunden.


public function relations()

{

    return array(

        'user'=>array(self::BELONGS_TO, 'DUser', 'user_id') // user_id anstatt id

    );

}

das hatte ich auch zuerst vermutet, aber das ist es leider nicht <.<

Also um mal näher das Problem zu beschreiben, ich habe in der User tabelle 6 user drin

id 1, 2, 3, 70, 71, 72 (hab zwischendurch mal welche gelöscht)

in der company tabelle hab ich 3 stück drin:

id 1, 2, 3

user_id 70, 71, 72

wenn ich jetzt in meinem CGridView auf die detailansicht klicke soll er mir die details aus der company tabelle anzeigen (funzt auch), nun möchte ich dort aber gerne noch die andere tabelle mit verknüpfen um in der detailansicht auch diese daten anzeigen zu können.

Wenn ich jetzt auf den Company-Eintrag mit der id 1 klicke, bekomme ich den user mit der id 1

wenn ich auf id 2 klicke bekomme ich den user mit der id 2 usw.

Habe da absolut keine Erklärung für, es sieht so aus als würde das System für die relationale abfrage die Id von der company verwenden und nicht das was in der user_id spalte steht.

Hab meinen Beitrag nochmal aktualisiert

Okay, das war es :)

Danke dir :)

Kurze Frage noch, jetzt habe ich im GridView die Möglichkeit bei den columns "user.username" mit anzugeben, allerdings kann ich nicht die Suchfunktion verwenden, geht das auch irgendwie? ^^

Hierzu gibt es einen Wiki Artikel: Searching and sorting by related model in CGridView

Herzlichen Dank!