League/CSV est un wrapper merveilleusement simple autour du support CSV natif de PHP, et il est simple de transférer les résultats de votre collection Laravel Eloquent vers CSV.
Vous pouvez faire beaucoup plus avec CSV, alors consultez la documentation, mais voici une recette simple pour commencer :
1. Installez CSV
$ composer require league/csv
2. Préparez les données
Disons que vous êtes dans un export
méthode dans votre contrôleur.
public function export()
{
$people = Person::all();
}
3. Créez le fichier CSV en mémoire
$csv = \League\Csv\Writer::createFromFileObject(new \SplTempFileObject);
4. Créez vos en-têtes
Vous pouvez passer manuellement un tableau de vos en-têtes, mais c’est la rapidité avec laquelle vous pouvez le faire fonctionner dans un prototype :
$csv->insertOne(array_keys($people[0]->getAttributes()));
Vous venez d’insérer une ligne (insertOne()
) rempli d’un tableau des noms de colonnes de votre people
tableau.
Grâce à Steve Barbera sur Twitter pour avoir souligné que le code que j’avais à l’origine échouerait dans de nombreux contextes.
5. Insérez vos lignes
foreach ($people as $person) {
$csv->insertOne($person->toArray());
}
6. Envoyez-le à l’utilisateur
$csv->output('people.csv');
C’est ça! … sorte de. Si vous utilisez le rédacteur CSV output()
méthode, il écrira directement dans le navigateur, ce qui convient dans certains contextes. Mais dans Laravel, vous feriez mieux de créer un objet de réponse Laravel et de définir vos en-têtes manuellement, puis d’ajouter la sortie CSV à cet objet de réponse, comme ceci :
return response((string) $writer, 200, [
'Content-Type' => 'text/csv',
'Content-Transfer-Encoding' => 'binary',
'Content-Disposition' => 'attachment; filename="people.csv"',
]);
Conclusion
Maintenant, c’est vraiment ça ! Vous transférez maintenant tout le résultat d’une collection Eloquent directement au format CSV. Regardons ça:
public function export()
{
$people = Person::all();
$csv = \League\Csv\Writer::createFromFileObject(new \SplTempFileObject);
$csv->insertOne(array_keys($people[0]->getAttributes()));
foreach ($people as $person) {
$csv->insertOne($person->toArray());
}
return response((string) $writer, 200, [
'Content-Type' => 'text/csv',
'Content-Transfer-Encoding' => 'binary',
'Content-Disposition' => 'attachment; filename="people.csv"',
]);
}
Si quelqu’un visite cet itinéraire, il obtiendra people.csv
téléchargé directement dans leur navigateur. Fait.
Encore une fois, consultez la documentation pour en savoir plus à ce sujet. J’espère que ça aide!