Problema con Query ddi ricerca

Salve ragazzi,

sono sul modello "HOUSE"

come faccio ad estrarre i dati per creare la view che vedete in foto?

Cioè come faccio ad arrivare ad estrarre i datidella tavbella user ?

Grazie

Dipende da come sono, nella realta, queste relazioni… lo chiedo perchè talvolta la realtà è diversa dallo schema SQL che ci postano gli utenti :)

House HAS_MANY (1-a-n) Contract o HAS_ONE (1-a-1) Contract ?

Contract HAS_MANY Contract_User o HAS_ONE Contract_User ?

Contract_User immagino che per forza BELONGS_TO (1-a-1) User (questa è l’unica semplice).

Domanda ausiliaria: hai già creato le relations tra le classi? Sei su Yii 1 o 2? Metti sempre il tag davanti alla domanda.

… dicevamo … se Sono tutte HAS_MANY e/o BELONGS_TO, allora una volta che hai creato le singole relazioni e che nella variabile $house hai UN oggetto House puoi fare questo





$user = $house->contract->contract_user->user;




Magari fallo uno step alla volta e verifica (!is_null($contract … )

E hai il tuo oggetto User nella variabile $user.

Se le prime due relazioni sono HAS_MANY, cioè una House può avere n contratti, devi creare dentro a House la relation HAS_MANY con i Contract, quindi devi scorrere tutti i contratti per determinare in qualche modo QUALE ti interessa in quel momento





$contracts = $house->contracts

foreach ($contracts as $contract) 

{

    ... individuare QUALE contract ti interessa

   $usefull_contract = ....

}




Idem per identificare il contract_user corretto

Mi sfugge però lo scopo della tabella Contract_User. Non avresti semplicemente potuto inserire un campo id_user nella tabella Contracts?

Tornando in topic: ti serve una mano a creare le relazioni tra le classi dei modelli?

Ciao Realtebo,

grazie per la risposta. Cercherò di essere piu chiaro.

Sto usando Yii2 e le classi sono state create tutte.

Ad ogni casa(House) puo’ essere associato 1 o piu’ contratti

Ogni contratto puo’ essere associato a uno o piu’ utenti

quindi ogni utente puo’ appartenere ad uno o piu contratti.

Quindi ho una relazione 1 a molti tra House e Contract e una relazioni molti a molti tra Contract e User.

Quindi ricapitolando

Model House ho la relazione

public function getContracts()

{


    return $this->hasMany(Contract::className(), ['id_house' => 'id_house']);


} 

Model Contract ho la relazione

public function getContractUsers()

{


    return $this->hasMany(contractUser::className(), ['id_contract' => 'id_contract']);


} 

Model Contract_User ho la relazione

public function getUsers()

{


   return $this->hasOne(User::className(), ['id_user' => 'id_user']);


} 

Model User ho la relazione

public function getContractUsers()

{


   return $this->hasMany(contractUser::className(), ['id_user' => 'id_user']);


} 

La mia difficoltà è nel creare, nel model houseSearch, la query da passare alla GridView, della pagina index di House, per estrarre i seguenti dati

House,

Contract Number,

User

Model houseSearch

public function search($params)

{


    $query = House::find();


    $query->joinWith(['contracts'.......


   codice incompleto perchè non so che relazione mettere per arrivare al model User


}

Ripeto il problema: se ad un oggetto House sono legati PIU oggetti Contract, in base a cosa decidi QUALE contratto per ciascuna riga mostrare?

Se invece vuoi estrarre l’intera ‘matrice’, passami il termine, in cui cioè veddi tutti gli utenti di tutti i contratti di tutte le case, allora devi predisporre una bella catena di join.

Prova questa strada




$dataProvider=new CActiveDataProvider('House,array(

                                        'criteria'=>array(

                                            'with'=>array('contract')

                                   )));



così ogni House potrebbe comparire piu volte SE ci sono piu contratti.

Come estrarre anche l’utente?

Qui non riesco ad esserti utile. Non saprei come incatenare una DOPPIA relazione one to many.

In breve: a questo punto ti conviene creare il sql a manina, es usarlo in un DbCommand con queryAll. Avrai un array che potrai dare in pasto alla classe CActiveDataProvider per ottenere qualcosa di digeribile dalla CGridView, ma penso proprio sarà dura poi gestire ordinamenti e ricerca.

Ok grazie