在Symfony Admin中使用多个连接到Excel的Mysql查询

在Symfony Admin中使用多个连接到Excel的Mysql查询,mysql,excel,symfony1,doctrine,Mysql,Excel,Symfony1,Doctrine,我已经创建了一个很好的注册前端应用程序,用于注册活动的新用户 我现在希望从管理员生成的后端创建所有与会者的Excel导出 目前,我已经编写了一些SQL语句,它们为我提供了所需的精确表: select CONCAT(p.first_name,' ',p.last_name) as "Registered User", p.email_address as "Register Email", p.country as "Register Country", t.name as "Attendee

我已经创建了一个很好的注册前端应用程序,用于注册活动的新用户

我现在希望从管理员生成的后端创建所有与会者的Excel导出

目前,我已经编写了一些SQL语句,它们为我提供了所需的精确表:

select 
CONCAT(p.first_name,' ',p.last_name) as "Registered User",
p.email_address as "Register Email",
p.country as "Register Country",
t.name as "Attendee Type" ,
CONCAT(a.first_name, ' ',a.last_name) as "Attendee",
CONCAT(disc.name, ' ',disc.sex) as "Discipline",
CONCAT(divi.category, ' ', divi.weight) as "Division",
a.sex as "Sex",
a.club_name as "Club Name",
a.accomodation as "Accommodation",
a.`sharing_with1` as "Sharing With A",
a.`sharing_with2` as "Sharing With B",
a.`flight_number` as "Flight Number",
a.`flight_datetime` as "Flight Date",
a.`flight_time` as "Flight Time",
if(a.visa > 0, 'Yes', 'No') as "Visa",
a.dob as "Date of Birth",
a.passport as "Passport",
a.`expiry_date` as "Passport Expiry"

from `profile` p, `type` t,

`attendee` AS a LEFT JOIN `division` AS divi ON (a.division_id = `divi`.id) 
LEFT JOIN discipline AS disc ON (divi.discipline_id = disc.id)

where a.profile_id = p.id
 AND a.type_id = t.id 
正如您所看到的,很少有标准联接和外部联接

我还意识到我可以在模板中创建包含数据的原始HTML表,并更改文件头以将其定义为Excel文件。。。用户在Excel中下载并打开文件,但从不知道两者之间的区别

我想知道的是;根据我所拥有的,例如sql和输出计划,最好的方法是什么来充分利用symfony来实现这一点


注:Symfony 1.4与条令

我认为CSV也是一个不错的选择,可以用Excel打开CSV文件

无论如何,您可以在模块上创建一个新操作。我建议您将其添加到“新记录”按钮中,它将与“新记录”按钮一起显示

在您的操作中,您只需执行您的请求:

$this->dbh = Doctrine_Manager::getInstance()->getConnection('doctrine');
$stmt = $this->dbh->prepare($query);
$stmt->execute();
$stmt->fetchAll();
您可以像这样添加所需的响应头:

$this->getResponse()->setHttpHeader('Content-Type', 'application/poney/excel');
如果需要,可以绕过模板:

return $this->renderText($html);

如果您尝试使用CSV\o/

我认为CSV也是一个不错的选择,CSV文件可以用Excel打开

无论如何,您可以在模块上创建一个新操作。我建议您将其添加到“新记录”按钮中,它将与“新记录”按钮一起显示

在您的操作中,您只需执行您的请求:

$this->dbh = Doctrine_Manager::getInstance()->getConnection('doctrine');
$stmt = $this->dbh->prepare($query);
$stmt->execute();
$stmt->fetchAll();
您可以像这样添加所需的响应头:

$this->getResponse()->setHttpHeader('Content-Type', 'application/poney/excel');
如果需要,可以绕过模板:

return $this->renderText($html);

如果您试图服务与您的问题无关的CSV\o/

则很有用:您应该将联接更改为显式:从attendee作为联接配置文件在a.profile上作为p\u id=p.id联接`type`作为t在a.type上作为t\u id=t.id左联接……我可以,但这会有任何区别。我的方式会不会引起任何问题。我总是使用其中的tableA.tableB_id=table_b.id进行标准联接。目前这是正确的输出。不,在这种情况下,两种方法是等效的。正如您已经知道的,您不能编写与WHERE的外部联接。对内部联接使用联接也更好,因为您将联接逻辑与可能有的条件分开,或者稍后添加,在本例中没有。另外,你不能用WHERE写一个左连接b连接c,这是一个非常公平的观点。自从上次发表评论以来,我做了一些研究,我认为按照你建议的方式做会更好。谢谢从现在起,我会用正确的方法去做。这样读起来会更好。与你的问题无关:你应该将连接更改为显式:从attendee作为连接配置文件作为a.profile上的p\u id=p.id连接`type`AS t作为a.type上的t\u id=t.id左连接…我可以,但这有什么区别吗。我的方式会不会引起任何问题。我总是使用其中的tableA.tableB_id=table_b.id进行标准联接。目前这是正确的输出。不,在这种情况下,两种方法是等效的。正如您已经知道的,您不能编写与WHERE的外部联接。对内部联接使用联接也更好,因为您将联接逻辑与可能有的条件分开,或者稍后添加,在本例中没有。另外,你不能用WHERE写一个左连接b连接c,这是一个非常公平的观点。自从上次发表评论以来,我做了一些研究,我认为按照你建议的方式做会更好。谢谢从现在起,我会用正确的方法去做。那样读起来会更好。