Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Doctrine orm 流:将对象转换为数组以进行CSV导出_Doctrine Orm_Flow Framework - Fatal编程技术网

Doctrine orm 流:将对象转换为数组以进行CSV导出

Doctrine orm 流:将对象转换为数组以进行CSV导出,doctrine-orm,flow-framework,Doctrine Orm,Flow Framework,我想将我的对象“mitglied”导出为.csv文件。我的控制器看起来像: public function exportAction() { // find all mitglieds $records = $this->mitgliedRepository->findTennis(); // Set path for export-file $csvPath = '/var/www/apps/flow/Packages/Application/I

我想将我的对象“mitglied”导出为.csv文件。我的控制器看起来像:

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);
}
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;
}
调用exportAction时,我得到一个错误:

#1:警告:fputcsv()希望参数2是数组,对象在/var/www/apps/flow/Data/Temporary/Development/Cache/Code/flow\u object\u Classes/itoop\u atc\u Controller\u MitgliedController.php第494行中给出

第494行是

fputcsv($fp, $lines);
…所以我想我必须将对象“mitglied”转换为数组

我的MitgiledRepository中的公共函数
findTennis
如下所示:

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);
}
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;
}
我试着设置成数组();在存储库中,如下所示:

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;
}
但是我得到了以下错误:

#1:注意:未定义的属性:TYPO3\Flow\Persistence\doctor\QueryResult:$toArray in/var/www/apps/Flow/Data/Temporary/Development/Cache/Code/Flow\u Object\u Classes/itoop\u atc\u Domain\u Repository\u MitgliedRepository.php第105行

第105行当然是

 ->toArray;
有人知道如何在流中将对象转换为数组吗

在下面的示例中,导出是有效的,因此我认为(存储库查询的格式)是问题所在

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);
}

请给我指一下正确的方向。谢谢大家!

已解释错误消息 #1:警告:fputcsv()希望参数2是数组,对象在/var/www/apps/flow/Data/Temporary/Development/Cache/Code/flow\u object\u Classes/itoop\u atc\u Controller\u MitgliedController.php第494行中给出

fputcsv
希望它的第二个参数是数组。该数组将作为CSV行写入单个文件,每个数组元素作为列。当在
$records
变量上迭代时,会得到域对象类的实例(因此可能是
ITOOP\Atc\domain\Model\Mitglied
)。这是未定义的行为,因此是警告

#1:注意:未定义的属性:TYPO3\Flow\Persistence\doctor\QueryResult:$toArray in/var/www/apps/Flow/Data/Temporary/Development/Cache/Code/Flow\u Object\u Classes/itoop\u atc\u Domain\u Repository\u MitgliedRepository.php第105行

toArray
是一个由Doctrine
QueryResult
类提供的函数。通常,条令查询不会获取查询返回的所有对象,而是返回一个按需获取和映射实体的方法。
toArray
方法一次获取所有记录,并返回一个数组而不是迭代器。出现错误的原因是您试图将
作为属性访问数组,而不是将其作为方法调用。以下代码是正确的:

$result = $query->matching($query->equals('abteilung', 'Tennis'))
                ->setOrderings(array('name' => \TYPO3\Flow\Persistence\QueryInterface::ORDER_ASCENDING))
                ->execute()
                ->toArray(); // <- Mind the brackets!
更好的解决方案 呈现CSV数据不是控制器应解决的问题。基本上,它应该进入一个视图。您可以实现一个自定义视图类来处理CSV输出

为此,您需要实现
\TYPO3\Flow\Mvc\View\ViewInterface
。最简单的方法是子类化
\TYPO3\Flow\Mvc\View\AbstractView
。命名视图类
\view\\Action
(例如
ITOOP\Atc\view\Mitglied\ExportCsv
。在视图的
render()
方法中实现CSV导出逻辑。一旦视图类出现,Flow将自动拾取并使用它


实现自定义视图有详细的解释——虽然是德语,但基于您的类命名,我怀疑这不会是一个问题;)。

我用任意DQL解决了这个问题。正如我提到的,我认为问题在于我没有得到查询结果的数组。但通过我的存储库中的以下查询,我做到了:

/**
* @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);
}

我认为重要的部分是getResult(\Doctrine\ORM\Query::hydrome\u ARRAY)

非常感谢您的详细解释。我用任意的DQL解决了这个问题,就像我在下面的回答中解释的那样。