Questa è difficile (query)

Salve, questa volta non sò da dove iniziare… :(

  1. Ho una tabella_A relazionata a tabella_B (1 a N)

  2. Quando creo un nuovo record nella tabella_B, vorrei generare nello stesso istante un nuovo record anke sulla tabella_A …

qualche prezioso consiglio ?

tnx :)

quindi per ogni record di B hai un Record di A ?

Bella domanda, da utente attento ;) !!

No solo per il primo caso/evento di inserimento (tabella_B ) poi il tutto si svolgerà sulla tabella_B

sinceramente non ho capito bene, ti consiglio di guardare InnoDB Update e Delete.

ad esempio Delete => cascade, fa si che se si cancella un elemento dalla tabella A, vengono cancellati tutti gli elementi dalla tabella B correlati dalla chiave esterna. Forse puoi tirarci fuori qualcosa di utile per il tuo problema

No ma il mio interesse non è per il delete ma bensì una procedura che all’inserimento nuovo record in tabella_B mi vada a inserire magicamente nella tabella_A un nuovo rigo (solo al primo inserimento di tabella_B )

Un stored procedure può tornarmi utile ? O Yii me ne farebbe fare a meno ?

tnx

Ho due tabelle (CAMION e PACCHI) vorrei far si che all’inserimento di un nuovo PACCO venga automaticam inserito un nuovo id alla tabella dei CAMION… si può :( ?

Niente di più semplice:




$pacco = new Pacco();

$pacco->peso = 33;

$pacco->save();


$camion = new Camion();

$camion->caricaPacco($pacco);



A parte che un nuovo pacco non vuol dire un nuovo camion… :) comunque …

secondo me dovresti creare un nuovo record CAMION nel controller del PACCO nella action create e update.

Prima di model->save() del pacco controlla se ha l’id istanziato… se non è ancora assegnato vuol dire che è un nuovo record e in quel caso crei un nuovo model di CAMION e lo salvi.

Nella action delete invece, prima di eliminate il pacco, ricerchi il camion e se non associato ad altri pacchi elimini il camion.

proid, era ovvio quello che volevo dire. Provo a scomporlo. Ovviamente ci vuole un ciclo, ovviamente no: non sto inserendo sempre lo stesso pacco nel camion.

Creare pacchi




$pacco = new Pacco();

$pacco->peso = 33;

$pacco->save();



Aggiungere pacchi al camion




$camion = new Camion();

$camion->caricaPacco($pacco);

$camion->caricaPacco($pacco);

$camion->caricaPacco($pacco);

$camion->caricaPacco($pacco);

$camion->caricaPacco($pacco);

$camion->save();



scusa sensorario non avevo la tua replica quando ho scritto, rispondevo a paskuale… sicuramente stavamo scrivendo contemporaneamente nel forum!

Appunto è come scrivi tu ma avevo capito che paskuale voleva inserire un record CAMION ad ogni nuovo record PACCO, cioè volava fare una relazione 1:1 invece che 1:molti … mi sembrava sbagliato

No in realtà la relazione tra CAMION --> Pacco è 1->N solo che mi serviva autogenrare un camion (progressivo) al primo pacco creato dall’utente. Tutto qui, ed effettivamente nell’attesa della vs preziosa risposta :) son finito anch’io a modificare il codice nel controller/create solo che per sicurezza ho aggiunto un rollback nel caso si verifichino degli errori non vorrei ritrovarmi camion vuoti vhe brancolano nel buio :lol:

(nel PaccoController, action:create)




$trans = Yii::app()->db->beginTransaction();

		 $model=new Pacco;

		 $modelcc = new Camion;

if(isset($_POST['Pacco']))

		{

			$model->attributes=$_POST['Pacco'];

			try {

				$modelcc->save(false);

				

				$model->attributes=$_POST['Pacco'];

				$model->cc_id_fk=$modelcc->cc_id;

	            		$model->save(false); 

	            		$trans->commit();

				

				$this->redirect(array('Pacco/view','id'=>$modelcc->fk_id));

	            	        			

        		} catch (Exception $e) {

                		

				$trans->rollback();

                		throw $e;	

        		}

		}

Ciao a tutti,

volendo, se è una cosa automatica e valida per ogni inserimento, potresti usare un trigger MYSQL del genere:




CREATE TRIGGER pacco_Trigger

AFTER insert ON pacco

FOR EACH ROW

    BEGIN

    insert into camion values(new.id,new.first_name,

    new.last_name,new.start_date,new.end_date,

    new.city,new.description,curtime());

    END



… vedi un po’!

Lo sconsiglio caldamente: usare i trigger significherebbe dipendere dal database. Quello che invece si può fare, è una gestione dell’evento. Yii, è uno dei pochi framework che ha l’EDP. Ovvero la programmazione orientata agli eventi. E’ possibile creare un evento onCamionCreation, per poi richiamarlo al momento opportuno. In quel momento, è quindi possibile fare tutte le operazioni del caso.

PS. L’idea del trigger è ottima e decisamente più performante della mia soluzione. Se non hai in previsione di cambiare db, te la consiglio anche io.

Innanzitutto ringrazio emafer x i trigger che nn avevo mai visto su mysql, poi ringrazio pure quel gran simpaticone di senso che nun a capit che qui (oltre alla preziosa teoria) volemo i fatti ?!?! Uno stralcio di codice di come gestisce l’evento yii ?

grassie ;D

Faccio un wiki in italiano appena ho tempo.

Dai almeno sensorario ti ha indicato la strada… è sempre meglio che lasciarti solo con le tue domande :)

A me non piace mettere logica nel database (trigger), opinione personale comunque, preferisco gestire la cosa lato applicazione anche perchè se il db si INCAZZA per qualche violazione (es. vincoli di integrità o altro) ti esce un bell’errore a video… tanto vale gestire la cosa lato applicazione così puoi prevenire anche le eccezioni lato DB.

Poi se cambi dbms … riadatta li codice lato DB e buon divertimento

B) in realtà mi son permesso solo perchè sensorario è uno dei miti qui sul forum :lol: và davvero forte, ha una velocità di apprendimento molto alta!! Solo che in passato ho istigato agli esempi perchè molti come me non hanno la stessa rapidità di senso e dovrebbero recuperare terreno B)