Search code examples
doctrine-ormflow-framework

Flow: Convert object to array for CSV export


I want to export my object "mitglied" to a .csv-file. My controller looks like that:

public function exportAction() {

    // find all mitglieds
    $records = $this->mitgliedRepository->findTennis();

    // Set path for export-file
    $csvPath = '/var/www/apps/flow/Packages/Application/ITOOP.Atc/Resources/Private/Export/test.csv';

    $fp = fopen($csvPath, 'w');

    foreach ($records as $lines) {
        fputcsv($fp, $lines);
    }

    fclose($fp);
}

When I call the exportAction, I get a an error:

#1: Warning: fputcsv() expects parameter 2 to be array, object given in /var/www/apps/flow/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/itoop_atc_Controller_MitgliedController.php line 494

line 494 is...

fputcsv($fp, $lines);

...so I think I have to convert the object "mitglied" to an array.

My the public function findTennis in my mitgliedRepository looks like that:

public function findTennis() {
    $query = $this->createQuery();
    $result = $query->matching($query->equals('abteilung', 'Tennis'))
                    ->setOrderings(array('name' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING))
                    ->execute();

    return $result;
}

I tried to set toArray(); in the repository like the that:

public function findTennis() {
    $query = $this->createQuery();
    $result = $query->matching($query->equals('abteilung', 'Tennis'))
                    ->setOrderings(array('name' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING))
                    ->execute()
                    ->toArray;
    return $result;
}

But then I get the following error:

#1: Notice: Undefined property: TYPO3\Flow\Persistence\Doctrine\QueryResult::$toArray in /var/www/apps/flow/Data/Temporary/Development/Cache/Code/Flow_Object_Classes/itoop_atc_Domain_Repository_MitgliedRepository.php line 105

line 105 of course is

 ->toArray;

Does anybody know, how to convert an object to an array in flow?

With the following example the export works, so I think the (formatting of the) repository query is the problem.

public function exportAction() {
    // Set path for export-file
     $csvPath = '/var/www/apps/flow/Packages/Application/ITOOP.Atc/Resources/Private/Export/test.csv';

 $test = array (
     array('xxx', 'bbb', 'ccc', 'dddd'),
     array('123', '456', '789'),
     array('aaa', 'bbb')
 );


 $fp = fopen($csvPath, 'w');

 foreach ($test as $lines) {
     fputcsv($fp, $lines);
 }

 fclose($fp);

}

Please point me to the right direction. Thank you!


Solution

  • I solved the problem with arbitrary DQL. As I mentioned I think the problem was that I didn't got an array as result by the query. But with the following query in my repository I do:

    /**
    * @Flow\Inject
    * @var \Doctrine\Common\Persistence\ObjectManager
    * inject Doctrine's EntityManager to execute arbitrary DQL
    */
    protected $entityManager;    
    
    /**
    * find mitglieder with Abteilung Tennis und return an array
    */
    public function exportTennis() {
        $query = $this->entityManager->createQuery("SELECT mitglied FROM \itoop\atc\Domain\Model\Mitglied mitglied WHERE mitglied.abteilung = 'Tennis'");
        return $query->getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);
    }
    

    The important part I think is getResult(\Doctrine\ORM\Query::HYDRATE_ARRAY);