我有几个表是连接在一起的。
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);
}
除了加入的表之外,我想返回的其他数据都没有问题,返回得很好。任何关于解决这个难题的帮助都将是巨大的。
如果你想从加入的表中获取数据,并将其导出到某个地方,我在这里建议你按照这些步骤来做。
我已经在这种开发上工作了近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执行你的主函数,它应该可以完美地工作。我不想复制你的代码,因为我的桌面上已经有了一个例子,我想让你自己去找。有了这一点,我想已经足够引导你找到解决的办法了.干杯!