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

1 php mysql database csv yii

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

用户表:

ID , Name , Age , phone , . .......
Run Code Online (Sandbox Code Playgroud)

在ID的基础上,关系是与例如表格的关系

User_cars
ID,User_ID(fk),Make , Model , .....
Run Code Online (Sandbox Code Playgroud)

我需要做的是将这些数据存储在CSV文件的数据库中.由于存在一对多关系,因此简单连接不起作用,因为行是重复的.(不可显示客户端的格式:S)

我使用Yii作为Web应用程序,需要一些扩展,可以用一些可读的方式呈现它.

或者也许PHP脚本也可以完成任务.

Vla*_*eda 5

您可以通过以下两种方式之一处理它:

1.使用GROUP_CONCAT(如注释中提到的@Dave - 这是链接:MYSQL PHP API - 在另一个表的行中显示和获取多行).但是有一个缺点,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
Run Code Online (Sandbox Code Playgroud)

如果每个用户有30-40个条目,并且不可读,则会变得非常复杂.

2.第二种选择是以下列格式导出它(不难做到,你只需遍历用户拥有的所有汽车,但只在第一次迭代中写入用户).


ID | Name | Car Model | Year
1    John   BMW         1999
            Audi        2000
            Renault     2003
2    David .....
Run Code Online (Sandbox Code Playgroud)

这是一些示例代码(我使用了大量的方法,具有暗示性的名称).

$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
Run Code Online (Sandbox Code Playgroud)