Yii2 - Ricavare un valore dal DB

Salve,

ho due tabelle Listino e dettaglio listino collegate tra di loro con relazione 1-n.

Listino


id_listino

data_validita

Dettaglio_listino


id_dettaglio_listino

id_listino

prodotto

prezzo

Tramite un actionReturnPrezzoProdotto vorrei ricavare il prezzo del prodotto.

Ecco la function:

public function actionReturnPrezzoProdotto($anno,$prodotto)

{

$sql="select * from Listino

  inner join dettaglio_listino on listino.id_listino=dettaglio_listino.id_listino


  where year(data_validita)=".$anno."  and prodotto=".$prodotto;

$rows = Listino::findBySql($sql)->all();

foreach($rows as $item)

{

 $prezzo=item->prezzo;

}

return $prezzo

}

Mi da errore. Come posso fare?

Grazie

Scrivi l’errore che si fa prima. Ad ogni modo ci sono molte inesattezze

Ciao Federico,

mi suggerisci la strada migliore per estrarre un valore di un campo dalla tabella

secondaria ?

E’ giusto fare una cosa del genere ?

public function actionAjaxReturnPrezzoArticolo($id_articolo)

  $Sql="select....."   /* select con innerjoin con la tabella dettagli passandoci nella clausa where $id_articolo */





 $rows = Prezzario::findBySql($sql)->asArray()->all();


      if($rows)


        {


         foreach($rows as $item)


                 {


                $prezzo=$item['prezzo'];


                 }


        }         


    return $prezzo;

Grazie.

Come prima cosa questo metodo che usi è quello più “istintivo” ma non rispecchia il pattern MVC. Infatti, deduco che stai lavorando con i dati (tipico del model) all’interno del controller.

Sembra pignoleria, ma devo ammettere che se tu crei la funzione nel model, hai il grosso vantaggio che se ti riserve x un altro controller la trovi già fatta.

E se un domani devi modificarla, lo fai in un punto solo.

Un’altra cosa che noto è che tu non segui il “consiglio” di iniziare sempre una tabella del db, con il campo ID e basta.

Io non sono un esperto di Yii2, mi piacerebbe diventarlo, sto studiando le cose che di volta in volta mi serve imparare.

Quello che non capisco nella tua richiesta è cosa vuoi ottenere. Cioè tu esegui una query che finisce con ->all() che in parole povere restituisce tutte le righe caricate dalla query.

Poi però fai un “orrendo” ciclo in cui giri tutte le righe e assegni alla variabile $prezzo il valore $item[‘prezzo’]…se ci pensi bene, $prezzo assumerà sempre il valore dell’ultimo $item[‘prezzo’] caricato.

Ma perchè non fare un ->one() ?

Quindi cosa farei tipo:

MODEL di Prezzario


public static function TrovaPrezzo($ArtId)

{

        $Sql="select....." /* select con innerjoin con la tabella dettagli passandoci nella clausa where  $id_articolo */

        $data = Prezzario::findBySql($sql)->one();

        return $data;

}

CONTROLLER


public function actionReturnPrezzoProdotto($anno,$prodotto)

{

  $data = Prezzario::TrovaPrezzo($id_articolo);

  //il prezzo sarà: $data->prezzo

}

ad ogni modo, non mi hai ancora detto che errore ti dava ;)

Ciao Federico.

Grazie per i consigli. L’errore precedentemente da me denunciato è stato risolto. Era solo un problema di sintassi, per questo non ti ho detto più nulla.

Grazie ciao