Php 将数据导出到CSV时处理一对多关系
我有一个数据库,它包含11个表,其中9个表与用户信息表有一对多的关系 用户表:Php 将数据导出到CSV时处理一对多关系,php,mysql,database,csv,yii,Php,Mysql,Database,Csv,Yii,我有一个数据库,它包含11个表,其中9个表与用户信息表有一对多的关系 用户表: ID , Name , Age , phone , . ....... 在ID的基础上,关系是与表的关系,例如 User_cars ID,User_ID(fk),Make , Model , ..... 我需要能够做的是在一个CSV文件中以DB的形式呈现这些数据。由于存在一对多关系,因此简单联接不起作用,因为行是重复的。不适用于客户端的格式:S 我使用Yii作为web应用程序,需要一些扩展,可以以可读的方式呈现它
ID , Name , Age , phone , . .......
在ID的基础上,关系是与表的关系,例如
User_cars
ID,User_ID(fk),Make , Model , .....
我需要能够做的是在一个CSV文件中以DB的形式呈现这些数据。由于存在一对多关系,因此简单联接不起作用,因为行是重复的。不适用于客户端的格式:S
我使用Yii作为web应用程序,需要一些扩展,可以以可读的方式呈现它
或者,php脚本也可以完成此任务。您可以通过以下两种方式之一处理此任务: 一,。使用注释中提到的@Dave-这是链接:。 但是,还有一个缺点,默认情况下,GROUP_CONCAT有1024个字符的限制,您可以使用服务器变量GROUP_CONCAT_max_len更改该限制,但您可能无权这样做 这看起来很像这样:
ID | Name | Car Model | Year
1 John BMW, Audi, Renault 1999, 2000, 2003
2 David Mercedes, Ford 2000, 2005
如果每个用户有30-40个条目,并且不可读,那么这可能会变得非常复杂
二,。第二个选项是以以下格式导出它不难做到,您只需迭代用户拥有的所有汽车,但只在第一次迭代中编写用户
下面是一些示例代码,我使用了很多虚构的方法,这些方法都有暗示性的名称
$csvArray = array();
foreach ($users as $user) {
$cars = $user->getCars(); //random method name. Grabs an array with the cars this user has :)
$firstIteration = 1;
foreach ($cars as $car) {
if ($firstIteration == 1) { // we only set the CSV row the first time we iterate through cars
$csvSingle['ID'] = $user->getId(); // more random method names
$csvSingle['Name'] = $user->getName();
$firstIteration = 0;
}
$csvSingle['car_model'] = $car->getCarModel();
$csvSingle['car_year'] = $car->getCarYear();
$csvArray[] = $csvSingle; // now we add the single row to the big CSV array.
}
}
fputcsv($handle, $csvArray); // $handle is the file you export to
您可以通过以下两种方式之一进行处理: 一,。使用注释中提到的@Dave-这是链接:。 但是,还有一个缺点,默认情况下,GROUP_CONCAT有1024个字符的限制,您可以使用服务器变量GROUP_CONCAT_max_len更改该限制,但您可能无权这样做 这看起来很像这样:
ID | Name | Car Model | Year
1 John BMW, Audi, Renault 1999, 2000, 2003
2 David Mercedes, Ford 2000, 2005
如果每个用户有30-40个条目,并且不可读,那么这可能会变得非常复杂
二,。第二个选项是以以下格式导出它不难做到,您只需迭代用户拥有的所有汽车,但只在第一次迭代中编写用户
下面是一些示例代码,我使用了很多虚构的方法,这些方法都有暗示性的名称
$csvArray = array();
foreach ($users as $user) {
$cars = $user->getCars(); //random method name. Grabs an array with the cars this user has :)
$firstIteration = 1;
foreach ($cars as $car) {
if ($firstIteration == 1) { // we only set the CSV row the first time we iterate through cars
$csvSingle['ID'] = $user->getId(); // more random method names
$csvSingle['Name'] = $user->getName();
$firstIteration = 0;
}
$csvSingle['car_model'] = $car->getCarModel();
$csvSingle['car_year'] = $car->getCarYear();
$csvArray[] = $csvSingle; // now we add the single row to the big CSV array.
}
}
fputcsv($handle, $csvArray); // $handle is the file you export to
我喜欢@Vlad Preda的第一个变体,在用于导出的控制器或组件中,您可以使用如下内容:
ID | Name | Car Model | Year
1 John BMW, Audi, Renault 1999, 2000, 2003
2 David Mercedes, Ford 2000, 2005
用汽车获取用户,汽车必须填写用户模型关系
$users=User::model->with'cars'->findAll
然后
foreach$users作为$user{
$csvOneUser=array'id'=>$user->id,name=>$user->name
如果!$user->cars{
$csvAll[] = $csvOneUser;
continue;
}
foreach$user->cars as$car{
$car_attributes = $car->getAttributes();
foreach ($car_attributes as $k=>$v) {
$csvOneUser[$k][] = $v;
}
}
}
我喜欢@Vlad Preda的第一个变体,在用于导出的控制器或组件中,您可以使用如下内容:
ID | Name | Car Model | Year
1 John BMW, Audi, Renault 1999, 2000, 2003
2 David Mercedes, Ford 2000, 2005
用汽车获取用户,汽车必须填写用户模型关系
$users=User::model->with'cars'->findAll
然后
foreach$users作为$user{
$csvOneUser=array'id'=>$user->id,name=>$user->name
如果!$user->cars{
$csvAll[] = $csvOneUser;
continue;
}
foreach$user->cars as$car{
$car_attributes = $car->getAttributes();
foreach ($car_attributes as $k=>$v) {
$csvOneUser[$k][] = $v;
}
}
}
看这条线,这是一个非常相似的问题。你可以使用joins+group\u concat来为你做这件事。所以你的问题是为你的数据提供一个可读的格式?是的,杰克这是我的问题。看这个帖子,这是一个非常类似的问题。你可以使用joins+group\u concat来为你做这件事。那么你的问题是提出一种可读的数据格式吗?是的,杰克这是我的问题。谢谢,这很好地解释了我的两个选择。非常感谢vlad、dave和jack以及yessiVery好的,谢谢你的例子。我肯定会采用第二种方法though@VladPreda@gakker如果我们有多个OneToMany关系,我们将如何修改第二选项代码?假设我们也有自行车链接到用户。谢谢,这很好地解释了我的两个选择。非常感谢vlad、dave和jack以及yessiVery好的,谢谢你的例子。我肯定会采用第二种方法though@VladPreda@gakker如果我们有多个OneToMany关系,我们将如何修改第二选项代码?假设我们也有链接到用户的自行车。