Folosesc codul de mai jos pentru a exporta informatii in FastExcel, stie cineva niste optiuni mai easy fara a mai folosi 2 foreach-uri pentru collection? Daca folosesc Arrays, nu functioneaza exportul.
$s2 = Data::all();
$data = collect([]);
foreach($s2 as $q) {
$r2 = SurveyQuestionAnswer::where('survey_question_id', $q->id)->get();
if($r2) foreach($r2 as $r) $data[] = $r;
}
return (new FastExcel($data))->download('export.csv', function ($d) {
export...
});
Eu as scoate acel if din foreach. Variabila $r2 o poti initializa in afara foreach-ului. Si poti sa pui in ea, rezultatul query-ului.
Si codul ar veni cam asa
$r2 = [];
foreach($s2 as $q) {
$r2 = SurveyQuestionAnswer::where('survey_question_id', $q->id)->get();
}
if (count($r2) === 0) {
//este gol. scrii in log, anunti user-ul etc
}
foreach ($r2 as $r) {
$data[] = $r;
}
//si mai departe vine codul cu return
O alta varianta este sa iti extragi direct datele care te intereseaza din baza fara sa mai faci 2 query-uri (din ce inteleg si Data:all() si acel where generaza un sql). Si o sa ai in acel $data informatiile care te intereseaza fara sa mai faci niciun foreach.
Acum cateva observatii.
Foloseste nume sugestive la variabile - r2, s2 etc nu spun nimic. Plus ca fac si codul greu de inteles
Nu da copy-paste la ce am scris eu. Ceea ce este acolo, este o idee. Este mai mult scris in stil pseudocod.
Din intrebarile tale, imi pare ca trebuie sa insisti mai mult pe lucrurile fundamentale (php/js). Eu nu stiu Laravel, dar ce ai acolo, nu mie se pare ca are vreo treaba cu framework-ul.
Nu vreau si niic nu imi doresc sa te descurajez
Ce am scris mai sus, sunt lucruri pe care mi le-au spus si mie altii mai intelepti.
Functia pluck e foarte utila in astfel de situatii.
$allData = Data::all(); // daca asta e un model, inseamna ca $allData e colectie, deci putem folosii pluck
$data = SurveyQuestionAnswer::whereIn('survey_question_id', $allData->pluck('id')->all())->get(); // la fel si asta este colectie deja
return (new FastExcel($data))->download('export.csv', function ($d) {
export...
});
Am rezolvat si foreach in foreach, si query n+1.
Daca nu mai folosesti $s2 = Data::all(); in alta parte in cod mai poti face inca o optimizare, ca sa extragi doar idul din db.
Exista metoda pluck in query builder fara sa faci query, si face query doar pe coloana specificata.
$data = SurveyQuestionAnswer::whereIn('survey_question_id', Data::pluck('id')->all())->get();
return (new FastExcel($data))->download('export.csv', function ($d) {
export...
});