Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.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
Php 将数据导出到CSV时处理一对多关系_Php_Mysql_Database_Csv_Yii - Fatal编程技术网

Php 将数据导出到CSV时处理一对多关系

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应用程序,需要一些扩展,可以以可读的方式呈现它

我有一个数据库,它包含11个表,其中9个表与用户信息表有一对多的关系

用户表:

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关系,我们将如何修改第二选项代码?假设我们也有链接到用户的自行车。