You do realize that you waste cycles and storage by saving it to a file first? Not to mention that the way you want to do it is either needlessly complex or will be buggy as all hell? Saving to a file first is a very good way to ensure that you will corrupt the file and someone will see data they are not supposed to.
Regardless, this is close enough to how you want do it:
// :: send download headers here ::
$data = $eloquentCollection->toArray();
fputcsv($out, array_keys($data[1]));
$out = fopen('php://output', 'w');
foreach($data as $line)
{
fputcsv($out, $line);
}
fclose($out);
This does not take into account edge cases or failure states. You will also need to investigate which headers you need to send to make this appear as a download to browsers.