Foreach / Collection Laravel

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...
});
2 Likes

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.

  1. Foloseste nume sugestive la variabile - r2, s2 etc nu spun nimic. Plus ca fac si codul greu de inteles
  2. Nu da copy-paste la ce am scris eu. Ceea ce este acolo, este o idee. Este mai mult scris in stil pseudocod.
  3. 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.
  4. Nu vreau si niic nu imi doresc sa te descurajez
  5. Ce am scris mai sus, sunt lucruri pe care mi le-au spus si mie altii mai intelepti.
  6. Din cand in cand, cate o pauza mai merge. :smiley:

Eu as extrage id-urile colectiei Data intr-un array si as folosi clauza whereIn ca sa construiesc colectia r2.

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...
});
2 Likes