从连接表中检索csv的数据

问题描述 投票:0回答:1

我有几个表是连接在一起的。

Meal
 Meal.id

MealIngredient
 Meal.id
 Ingredient.id

Ingredient
 Ingredient.id
 Ingredient.tag

我想从 Ingredients 中提取标签并将其传递到 CSV 文件,但我遇到了困难。

在我的控制器中

 $meals = $this->Meal->find('all', array(
//lots of other tables

'MealIngredient'=> array(  
   'Ingredient'=>array(
     'fields' => 'Ingredient.tag',
      )
    ),
 ));

然后当我去叫它

foreach($meals as $data){

fputcsv($csvFile, array(

    $data['MealIngredient'][0]['Ingredient']['tag'],
));
close($csvFile);

}

除了加入的表之外,我想返回的其他数据都没有问题,返回得很好。任何关于解决这个难题的帮助都将是巨大的。

php csv cakephp nested cakephp-2.0
1个回答
0
投票

如果你想从加入的表中获取数据,并将其导出到某个地方,我在这里建议你按照这些步骤来做。

我已经在这种开发上工作了近1年,所以我非常熟悉如何进行这种任务。

首先,你需要为你的Csv数据检索做一个函数,它应该是这样的。

public function main(){
      $from = date("Y-m-d 04:00:00", strtotime('-1 day')); // this is for 
          retrieving everyday's register from the system
      $to = date('Y-m-d 04:00:00');

      $this->genCsvPerson($from, $to);
}

private function genCsvPerson($from, $to){
        $options['joins'] = array(
            array(
                'table' => 'td_all_results_slugs',
                'alias' => 'ResultsSlug',
                'type' => 'INNER',
                'conditions' => array(
                    'Person.id = ResultsSlug.person_id'
                )
            ),
            array(
                'table' => 'td_addresses',
                'alias' => 'Address',
                'type' => 'INNER',
                'conditions' => array(
                    'Person.id = Address.person_id'
                )
            ), 


        );

        $options['conditions'] = array(
            'Person.email !=' => '',
            'AND' => array("Person.created BETWEEN '" . 
            $from. "' AND '" . $to. "'")
        );
        $options['fields'] = array(
            'Person.id', 
            'Person.email', 
            'Person.name',
           // Rest of fields go here...
        );
        $options['order'] = array('Person.id ASC');
        $options['group'] = array('Person.id');
        $doctors_csv = $this->Person->find('all', $options);
        $csvGenerator = new csvGenerator();
        $csvGenerator->csv_persons($persons_csv);

    }

在这之后,你应该在你的Vendor目录下制作CsvGenerator.php文件。在我的应用项目中,它是这样的。/var/www/myproject/trunk/app/Vendor/Csv/CsvDeltaGenerator.php

在那里,你将开发的功能,将检索和打印你的数据到CSV,然后为你导出到你设置的目录。

所以,进一步来说,你要做的事情是这样的。

class CsvDeltaGenerator {
    const MAIL = 'MAIL';
    const NAME = 'NAME';
    const SURNAME = 'SURNAME';
    const PHONE = 'PHONE';
    const EXTID = 'EXTID';
    const ENTRYDATE = 'ENTRYDATE';
    const URL = 'URL';
    const CONTRACT = 'CONTRACT';

    public $uses = array('Person');
    private $delimiter = ';';
    private $enclosure = '"';
    private $filename = 'Export.csv';
    private $line = array();
    private $buffer;
    private $array_final;

    public function __construct() {
        $this->clear();
    }

    private function clear() {
        $this->line = array();
        $this->buffer = fopen('php://temp/maxmemory:' . (5 * 1024 * 1024), 'r+');
    }

    private function addField($value) {
        $this->line[] = $value;
    }

    private function endRow() {
        $this->addRow($this->line);
        $this->line = array();
    }

    private function addRow($row) {
        $rows_deleted = 0;
        if (!empty($row)){
            fputcsv($this->buffer, $row, $this->delimiter, $this->enclosure);
        } else {
            return false;
        }
    }

    private function renderHeaders() {
        header("Content-type:application/vnd.ms-excel");
        header("Content-disposition:attachment;filename=" . $this->filename);
    }

    private function setFilename($filename) {
        $this->filename = $filename;
        if (strtolower(substr($this->filename,   -4)) != '.csv') {
            $this->filename .= '.csv';
        }
    }

    private function render($filename = true, $to_encoding = null, $from_encoding = "auto") {
            if ($filename) {
                if (is_string($filename)) {
                    $this->setFilename($filename);
                }
                $this->renderHeaders();
            }
            rewind($this->buffer);
            $output = stream_get_contents($this->buffer);
                $url = DIR_APLI.DS.'app'.DS.'webroot'.DS.'myproject'.DS.'csv'.DS.$this->filename;
            }

            $gestor = fopen($url, "w+") or die("Unable to open file");
            if (file_exists($url)) {
                file_put_contents($url, $output);
                chmod($url, 0777);
                fclose($gestor);
            } else {
                return false;
            }
        }else{
            return false;
        }
    }

    public function csv_doctors($doctors_csv) {
        $this->array_final = [self::MAIL, self::NAME, self::SURNAME,self::PHONE,self::EXTID, self::ENTRYDATE, self::URL]; //these are the headers of your CSV
        date_default_timezone_get('Europe/Madrid');
        $d = date("Ymd");
        $marketing_date = date('Y-m-d');
        $this->addRow($this->array_final);

        $array_extid = array();
        foreach ($persons_csv as $person) {
            $mail = $person['Person']['email'];
            $name = $person['Person']['name'];
            $surname = html_entity_decode($person['Person']['surname']);
            $apos = ''';
            $pos = strpos($surname, $apos);
            if($pos !== false) {
                $surname = str_replace(''', '\'', $surname);
            }
            $phone = $person['Address']['phone'];


            $extid = md5($person['Person']['email']);
            $entrydate =  $person['Person']['created'];
            $url = URL_APLI_WWW.'/'.PERSON:URL.'/'.$doctor_csv['ResultsSlug']['current_slug'];

            if(in_array($extid,$array_extid)){   //Check if there are 
               duplicates
                continue;
            } 

            array_push($array_extid, $extid);

            $arr = array();
            $arr[$this->getArrayKeyIndex($this->array_final, self::MAIL)] = $mail;

            $arr[$this->getArrayKeyIndex($this->array_final, self::NAME)] = $name;
            $arr[$this->getArrayKeyIndex($this->array_final, self::SURNAME)] = $surname;
            $arr[$this->getArrayKeyIndex($this->array_final, self::PHONE)] = $phone;

            $arr[$this->getArrayKeyIndex($this->array_final, self::EXTID)] = $extid;
            $arr[$this->getArrayKeyIndex($this->array_final, self::ENTRYDATE)] = $entrydate;

            $arr[$this->getArrayKeyIndex($this->array_final, self::URL)] = $url;
            $this->addRow($arr);
        }
        $filename = 'PERSON_CSV_' . $d;
        $this->render($filename);
}

最后要调用的函数是这个 我是私下调用它的,因为我只在其他函数的这个特定范围内需要它。它获取头名,并将其与我分配给每个组的变量进行分组。

   private function getArrayKeyIndex($array, $key){          
        for ($i = 0; $i < count($array); $i++) {
            if ($array[$i] == $key){
                return $i;
            }
        }
    } 

如果你通过Shell执行你的主函数,它应该可以完美地工作。我不想复制你的代码,因为我的桌面上已经有了一个例子,我想让你自己去找。有了这一点,我想已经足够引导你找到解决的办法了.干杯!

© www.soinside.com 2019 - 2024. All rights reserved.