我想导出一个symfony实体到CSV。我现在有这样的代码:
$em = $this->getDoctrine()->getEntityManager();
$iterableResult = $em->getRepository('AppBundle:Member')
->createQueryBuilder('m')
->where('m.association = :id')
->setParameter('id', $id)
->getQuery()
->iterate();
$handle = fopen('php://memory', 'r+');
$header = array();
while (false !== ($row = $iterableResult->next())) {
dump($row[0]);
fputcsv($handle, $row[0]);
$em->detach($row[0]);
}
rewind($handle);
$content = stream_get_contents($handle);
fclose($handle);
return new Response($content, 200, array(
'Content-Type' => 'application/force-download',
'Content-Disposition' => 'attachment; filename="export.csv"'
));
但是我有这个错误:
Warning: fputcsv() expects parameter 2 to be array, object given
您可以看到,我转储$row[0]用于调试:
成员{#1360▼-association: Association{#1444▶}-locality: Locality{#1421▶}-致敬:致敬{#1409▶}-国家:国家{#1454▶}id: 844- name:"TestName"名字:"TestFirstname"-date: DateTime{#1362▶}电子邮件:"email@domain.com"电话:"123456789"-地址:"中环四号道"描述:空}
我认为问题出在我的对象中有一个对象。导出包含对象的实体的正确方法是什么?
谢谢
不,问题正是警告所说的:fputcsv()期望第二个参数是一个数组,你正在传递一个对象(在这种情况下,根据你的转储输出,Member
的实例)
要解决这个问题,你至少需要将对象强制转换为数组
fputcsv($handle, (array) $row[0]);
或者实现像Member::toArray()
这样的东西并使用
fputcsv($handle, $row[0]->toArray());
或者,实现一个库来帮助您完成此操作,例如PHP League中的CSV。
最后,我使用了sonata-export bundle
开始工作了