1

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

用户表:

ID , Name , Age , phone , . .......

根据 ID,关系与表格有关,例如

User_cars
ID,User_ID(fk),Make , Model , .....

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

我使用 Yii 作为网络应用程序,需要一些可以以某种可读方式呈现它的扩展。

或者也许一个 php 脚本也可以完成这项任务。

4

2 回答 2

8

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

1.使用GROUP_CONCAT(正如评论中提到的@Dave - 这是链接:MYSQL PHP API - Displaying & Fetching multiple rows within rows from another table)。但是有一个缺点, 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 个条目并且不可读,这可能会变得非常复杂。

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


ID | Name | Car Model | Year
1    John   BMW         1999
            Audi        2000
            Renault     2003
2    David .....

这是一些示例代码(我使用了很多编造的方法,这些方法具有暗示性的名称)。

$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
于 2013-01-24T14:28:39.980 回答
0

我喜欢@“Vlad Preda”的第一个变体,在你的控制器或导出组件中你可以使用这样的东西:

  1. 用汽车获取用户(并且汽车必须填写用户模型关系)

    $users = User::model()->with('cars')->findAll();

  2. 进而

    foreach ($users 作为 $user) {

    $csvOneUser = array('id'=>$user->id, "name"=>$user->name);

    if (!$user->cars) {

    $csvAll[] = $csvOneUser;
    
    continue;
    

    }

    foreach ($user->cars as $car) {

    $car_attributes = $car->getAttributes();
    
    foreach ($car_attributes as $k=>$v) {
    
      $csvOneUser[$k][] = $v;
    
    }
    

    }

    }

于 2013-01-24T15:45:42.053 回答