Come Operare Sul Db?

Ciao a tutti,

da poco sto utilizzando Yii e sono qui a chiedervi un consiglio su come operare sul mio database mysql.

Ho una tabella ARTICOLI con tutte le info (prezzo, codice, descrizione,…).

Nella tabella MAGESE ho invece informazioni sulla disponibilità in magazzino (giacenza, prenotati, venduti,…).

Ho creato Model, Controller e View solo per gli ARTICOLI: come faccio ora a leggere le info della tabella MAGESE nella view di un singolo articolo? Effettuo una query semplicemente con php ?

Grazie!

Franco

Per partire:

Hai già stabilito le relation nei due model ?

ehm…no. Non saprei nemmeno come fare :S

iniziamo da più indietro: hai creato, a mano o con gii, i due model, uno per articoli ed uno per magese ?

se si, il passo dopo è capire le relazioni. Questo articolo ti potrebbe essere utilissimo

in caso contrario, andiamo indietro ancora di più: leggiti le basi di come si usa yii

Ho creato il model solo per gli articoli. Ora lo faccio per MAGESE e passo alla lettura dell’articolo che mi hai consigliato.

Che dire… grazie mille!

come vedi anche io sono qui da poco e mi sto sia documentando tantissimo, sia facendo aiutare tantissimo. finchè riesco faccio la mia parte per gli altri.

Leggiti prima il primo articolo: la sequenza solitamente è:

creo il model di ogni oggetto coinvolto

creo il crud dell’oggetto di cui ho bisogno di fare inserimenti e visualizzazioni

creo le tabelle se gii non le ha azzeccate

chiedo sul forum ;) per sistemare la specifica query.

Perfetto. Ho creato model e CRUD di MAGESE (anche se mi serviranno solo nella view degli articoli). Ora provo ad impostare la relazione.

le due tabelle come sono collegate?

il db è mysql con engine myisam o innodb?

se è il secondo puoi impostare le relazioni già a livello di database, e gii quando ti genera le CRUD

ti imposta direttamente le relazioni.

se non è così puoi farlo a mano.

es: se Articoli ha un record collegato in MAGNESE

devi andare nel Model Articoli al metodo relations e imposti




public function relations()

    {

        return array(

            'magnese'=>array(self::HAS_ONE, 'Magnese', 'campo_collegato'),

        );

    }



con campo_collegato che sarebbe la chiave esterna di Magnese collegata alla chiave primaria di Articoli

tra l’altro il consiglio è doppiamente buono, in quanto se non hai ancora fatto modifiche nei model puoi chiedere a Gii di ricreartele tenendo attiva l’opzione di creazione relazioni (non mi ricordo come si chiama) e, SE INNODB, ti crea le relation.

MyIsam non supporta le foreign key, per cui in questo caso devi crearle a mano, ma per me ti conviene per autodidattica crearle a mano, ti permetterà di capirle meglio, anche se inizialmente diventerai un po’ scemo

Grazie ancora per le altre info. Purtroppo il db è myisam.

Ho fatto tutti i passaggi richiesti ma non funziona probabilmente perchè, a livello di DB, non esite la chiave esterna nella tabella MAGESE… e purtroppo non posso modificare la struttura della tabella stessa(per tanti motivi).

Grazie davvero!

Non puoi convertire in InnoDB?

Tanto per chiarire: le relations funzionano perfettamente anche senza innoDB, semplicemente non vengono create di default.

Dai un occhio alla doc per le relations su come crearle a mano.

Facciamo una cosa, visto che anche io ti ho consigliato l’articolo sulle relations: dopo che l’hai letto ci scrivi per bene la relazione tra tabella A e tabella B e ti spieghiamo dove e come fare le relations.

Non avere paura per il Db, non serve convertirlo. Le relation, come diceva zaccaria, funzionano anche senza avere le foreign key definite. L’unica cosa veramente fondamentale è avere la chiave primaria definita nelle due tabelle, ma immagino che un ‘id’ autoinc ce l’avrai

io le ricreo tutte a mano, purtroppo a quanto vedo gii non supporta le relations su postgresql

poco male comunque, mi aiuta ad interrogarmi più volte sulla logica dell’applicazione.

buon lavoro ;)

Ciao. Scusa per l’assenza degli ultimi giorni. Non ho più lavorato su quel progetto ed ho momentaneamente sospeso lo studio di Yii.

In ogni caso, da oggi riprendo.

Ecco la situazione:

Tabella ARTICOLI

ID | CODICE | DESCRIZIONE1 | …altre colonne

Tabella MAGESE

ID | ART_CODICE | ESISTENZA | …altre colonne

Al momento opero in questo modo, senza aver specificato alcuna relazione:




$disp = Yii::app()->db->createCommand()

    ->select('ESISTENZA,ORDINATO,IMPEGNATO')

    ->from('magese')

     ->where('ART_CODICE="'.$data->CODICE.'"')

    ->queryRow();

grazie!

Diciamo che questo è il funzionamento semi-manuale, quasi come se usassi il comando mysql_query di php

Segui la strada di Yii.

Hai la tabella in DB? Si !

Hai creato il MODEL di ciascuna tabella ?

si si! ho creato model e operazioni crud di ciascuna tabella

bene !

Ora se non erro possiamo iniziare a creare l’interfaccia utente con form, filtro e lista, giusto ?

Per curiosità le due tabelle ARTICOLI e MAGESE come sono relazionate l’una all’altra ?

per esempio: magese.articoloId [n->1] articoli.id

Ad ogni modo, questo è il momento di creare il CRUD.

Vai in Gii e genera il CRUD per entrambi i model appena creati.

Ti consiglio questo intanto: http://www.yiiframework.com/doc/guide/1.1/it/quickstart.first-app

Ho generato il crud di entrambi i model.

Infatti finora ho proceduto in questo modo:


$disp = Yii::app()->db->createCommand()

    ->select('ESISTENZA,ORDINATO,IMPEGNATO')

    ->from('magese')

     ->where('ART_CODICE="'.$data->CODICE.'"')

    ->queryRow();

Il problema sta nel settare le relazioni e nel farle funzionare :S

Grazie!

Nel database MyIsam, ecco la situazione:

Tabella ARTICOLI

ID | CODICE | DESCRIZIONE1 | …altre colonne

Tabella MAGESE

ID | ART_CODICE | ESISTENZA | …altre colonne

In pratica la tabella MAGESE, che tiene traccia delle quantità in magazzino, contiene il CODICE dell’articolo.

ora sono io a non capire: se generi il crud tramite GII, il SQL che hai postato inserito a cosa ti serve ? Gii avrà creato lista con filtro + form + altre cose già funzionanti, giusto? Non modificare quello che ha fatto gii prima di aver capito davvero come muoverti.

Yii fa quasi tutto in completo automatismo, filtri compresi.

A parte questo chiarimento, andiamo avanti.

Capisco quindi che MAGESE.ART_CODICE [ N - > 1 ] ARTICOLI.ID

Nella function rules del model di MAGESE devi inserire




return array(

		        "articolo" => array(self::BELONGS_TO, 'ARTICOLI', 'ART_CODICE' ),

		);



A questo punto nella view admin di magese avrai una cgrid view con una sequenza di colonne, giusto ?

Me la puoi copia/incollare per favore?

per vedere il nome dell’articolo invece dell’id puoi fare tipo cosi: sostituisci




colums = array (

 ....

 ART_CODICE,

 .....

)






 array(

                'name'=>'ART_CODICE',

                'value'=>'data->articolo->DESCRIZIONE1',

        ),




Tieni conto che Yii è piuttosto CASE-SENSITIVE, se lavori con le maiuscole metti anche i nomi delle relazioni e i vari ‘name’ in maiuscolo

A questo punto avrai la descrizione dell’articolo di magazzino al posto del suo id nella vista admin di MAGESE.

Se siamo arrivati fino a qui, il prossimo passo sono prima il filtro e poi l’ordinamento.

Ma dimmi se sei riuscito a seguirmi fino a qui. Senza il codice sotto è un poco fatica…

In ogni modo, carica uno screenshot di cosa eventualmente non va su imageshack o similari e linkalo, così mi è più facile aiutarti.