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;
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;
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
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.