将Symfony实体导出为CSV


Export to CSV a Symfony entity

我想导出一个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

开始工作了