Yii Framework Forum: Relazioni Tra Tabelle - Yii Framework Forum

Jump to content

Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

Relazioni Tra Tabelle Rate Topic: -----

#1 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 09 November 2012 - 11:55 AM

Salve, ho un problema per quanto concerne la relazione tra tre tabelle. Ovvero

Tabella Listino
Id
Id_Servizio

Tabella Servizi
Id
Id_Settore

Tabella Settori
Id
Settore

All'interno del model Listino sono riuscito a relazionare la tabella Listino con quella dei Servizi, ma non riesco a relazionare la tabella Servizi con quella Settore. Vorrei fare in modo che il model Listino assuma la visualizzazione dei seguenti campi:

-Id
-Servizio
-Settore

Come posso fare. Grazie anticipatamente.
0

#2 User is offline   gdang 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 37
  • Joined: 20-August 11
  • Location:Venice

Posted 09 November 2012 - 01:20 PM

non capisco bene cosa vuoi fare, creare delle relazioni sui models?

tipo

	
public function relations()
	{
		return array(
....
			'translations' => array(self::HAS_MANY, 'Translation', 'post_id'),
...
		);
	}


?
I'm beautiful and I dance well!
0

#3 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 09 November 2012 - 01:25 PM

View Postgdang, on 09 November 2012 - 01:20 PM, said:

non capisco bene cosa vuoi fare, creare delle relazioni sui models?

tipo

	
public function relations()
	{
		return array(
....
			'translations' => array(self::HAS_MANY, 'Translation', 'post_id'),
...
		);
	}


?


Allora, ho creato il model Listino su cui ho realizzato la seguente relazione:

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(
			'servizi' => array(self::BELONGS_TO, 'Servizi', 'IdServizio'),
		);
	}


per visualizzare una vista che mi dia il nome completo del servizio e non l'Id. Inoltre ogni servizio contiene un riferimento alla tabella settore, per cui vorrei estrapolare anche il settore d'appartenenza.

La vista sarà composta:

Id (listino) | Servizio | Settore | Prezzo

Dal model Listino come faccio a creare la relazione tra Servizi e Settore??

Spero di essere stato più chiaro.
0

#4 User is offline   gdang 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 37
  • Joined: 20-August 11
  • Location:Venice

Posted 09 November 2012 - 04:49 PM

Nel modello listino che io sappia non puoi costruire relazioni tra servizio e settore, dovresti costruire tale relazione dovresti farlo sulle relazioni degli altri due modelli.

Poi utilizzi gli activerecord per ottenere i dati. Ma per una query simile utilizzerei direttamente sql. Se mi mandi in pm la struttura delle tabelle magari ti mando un paio di soluzioni. Ora sono col cell ma domani ti posso aiutare
I'm beautiful and I dance well!
0

#5 User is offline   sensorario 

  • Elite Member
  • Yii
  • Group: Moderators
  • Posts: 1,986
  • Joined: 07-September 10
  • Location:Cesena (Italy)

Posted 09 November 2012 - 07:07 PM

Potresti mostrarci il codice non funzionante?
1

#6 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 09 November 2012 - 08:19 PM

<?php

/**
 * This is the model class for table "listinoprezzi".
 *
 * The followings are the available columns in table 'listinoprezzi':
 * @property integer $Id
 * @property integer $UserId
 * @property integer $IdServizio
 * @property integer $IdListino
 * @property double $Prezzo
 *
 * The followings are the available model relations:
 * @property Users $user
 * @property Servizi $idServizio
 * @property Listino $idListino
 * @property Listino[] $listinoprezzis
 */
class ListinoPrezzi extends CActiveRecord
{
	/**
	 * Returns the static model of the specified AR class.
	 * @param string $className active record class name.
	 * @return Listino 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 'listinoprezzi';
	}

	/**
	 * @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('UserId, IdServizio, IdListino, Prezzo', 'required'),
			array('UserId, IdServizio, IdListino', 'numerical', 'integerOnly'=>true),
			array('Prezzo', 'numerical'),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('Id, UserId, IdServizio, IdListino, Prezzo', '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, 'Users', 'UserId'),
			'servizi' => array(self::BELONGS_TO, 'Servizi', 'IdServizio'),
			'listini' => array(self::BELONGS_TO, 'Listino', 'IdListino'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'Id' => 'Codice Listino',
			'UserId' => 'User',
			'IdServizio' => 'Id Servizio',
			'IdListino' => 'Id Listino',
			'Prezzo' => 'Prezzo',
		);
	}

	/**
	 * 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->join = 'INNER JOIN Servizi ON Servizi.Id=t.Id INNER JOIN Settore ON Settore.Id = Servizi.IdSettore';
		$criteria->compare('Id',$this->Id);
		$criteria->compare('UserId',Yii::app()->user->id);
		$criteria->compare('IdServizio',$this->IdServizio);
                
		$criteria->compare('IdListino',$this->IdListino);
		$criteria->compare('Prezzo',$this->Prezzo);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
        
        public function getSettore()
        {
            return $this->servizi->settore->Settore;
        }
}


Ho provato anche questa soluzione ma restituisce il seguente errore:

La proprietà "Servizi"."settore" non è definita.

Non so più come procedere!
0

#7 User is offline   giuseppe.farinella 

  • Newbie
  • Yii
  • Group: Members
  • Posts: 13
  • Joined: 04-November 12
  • Location:Palermo

Posted 09 November 2012 - 08:22 PM

View Postgiuseppe.farinella, on 09 November 2012 - 08:19 PM, said:

<?php

/**
 * This is the model class for table "listinoprezzi".
 *
 * The followings are the available columns in table 'listinoprezzi':
 * @property integer $Id
 * @property integer $UserId
 * @property integer $IdServizio
 * @property integer $IdListino
 * @property double $Prezzo
 *
 * The followings are the available model relations:
 * @property Users $user
 * @property Servizi $idServizio
 * @property Listino $idListino
 * @property Listino[] $listinoprezzis
 */
class ListinoPrezzi extends CActiveRecord
{
	/**
	 * Returns the static model of the specified AR class.
	 * @param string $className active record class name.
	 * @return Listino 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 'listinoprezzi';
	}

	/**
	 * @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('UserId, IdServizio, IdListino, Prezzo', 'required'),
			array('UserId, IdServizio, IdListino', 'numerical', 'integerOnly'=>true),
			array('Prezzo', 'numerical'),
			// The following rule is used by search().
			// Please remove those attributes that should not be searched.
			array('Id, UserId, IdServizio, IdListino, Prezzo', '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, 'Users', 'UserId'),
			'servizi' => array(self::BELONGS_TO, 'Servizi', 'IdServizio'),
			'listini' => array(self::BELONGS_TO, 'Listino', 'IdListino'),
		);
	}

	/**
	 * @return array customized attribute labels (name=>label)
	 */
	public function attributeLabels()
	{
		return array(
			'Id' => 'Codice Listino',
			'UserId' => 'User',
			'IdServizio' => 'Id Servizio',
			'IdListino' => 'Id Listino',
			'Prezzo' => 'Prezzo',
		);
	}

	/**
	 * 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->join = 'INNER JOIN Servizi ON Servizi.Id=t.Id INNER JOIN Settore ON Settore.Id = Servizi.IdSettore';
		$criteria->compare('Id',$this->Id);
		$criteria->compare('UserId',Yii::app()->user->id);
		$criteria->compare('IdServizio',$this->IdServizio);
                
		$criteria->compare('IdListino',$this->IdListino);
		$criteria->compare('Prezzo',$this->Prezzo);

		return new CActiveDataProvider($this, array(
			'criteria'=>$criteria,
		));
	}
        
        public function getSettore()
        {
            return $this->servizi->settore->Settore;
        }
}


Ho provato anche questa soluzione ma restituisce il seguente errore:

La proprietà "Servizi"."settore" non è definita.

Non so più come procedere!



[PROBLEMA RISOLTO]

il metodo era:

public function getSettore()
{
return $this->servizi->Settore->Settore;
}

avevo scritto Settore con la s minuscola!!

Grazieeeeeeeeee sensorario!!!! :D
0

#8 User is offline   gdang 

  • Junior Member
  • Pip
  • Yii
  • Group: Members
  • Posts: 37
  • Joined: 20-August 11
  • Location:Venice

Posted 10 November 2012 - 08:01 AM

:-) hahaha bene allora
I'm beautiful and I dance well!
0

Share this topic:


Page 1 of 1
  • You cannot start a new topic
  • You cannot reply to this topic

1 User(s) are reading this topic
0 members, 1 guests, 0 anonymous users