【问题标题】:Why does Laravel call to execute() return duplicate results?为什么 Laravel 调用 execute() 会返回重复的结果?
【发布时间】:2016-08-27 10:40:31
【问题描述】:

我是一个新的、缺乏经验的 Laravel 开发人员,我对得到的查询结果感到困惑。我正在尝试将查询结果写入 CSV 文件。我的代码:

$connection = fopen('/BSTablespace/someFile.txt', 'w');

$users = DB::table('users')->select('first_name', 'agent_id_from_website', 'sales_manager_id', 'last_name')->toSql();

$generator = function () use ($users){
        $db = DB::connection()->getPdo();

        $query = $db->prepare($users);
        $query->execute();

        while($user = $query->fetch()){
            yield($user);
        }
    };

foreach ($generator() as $g){
        fputcsv($connection, array_values($g));
    }
fclose($connection);

我不是每列得到一个结果,而是得到 2 个。一个用列名键控,一个用数字索引键控,如下所示:

'first_name' => 'Jane', 0 => 'Jane', 'agent_id_from_website' => '450', 1 => '450', 'sales_manager_id' => 317, 2 => 317, 'last_name' => 'Doe', 3 => 'Doe'

为什么我会得到重复的结果?显然我可以忽略重复项,但我很好奇为什么 PHP、Laravel 或 Postgres 会以这种方式处理它。

【问题讨论】:

    标签: php postgresql laravel eloquent


    【解决方案1】:

    你为什么不只是做->get()?你会得到奇怪的结果,因为这就是 PHP PDO 的工作方式。您使用的这些\Illuminate\DB 方法基本上是直接接触PDO。

    http://php.net/manual/en/pdostatement.fetch.php

    它返回顺序值和语句的给定名称。这可能是为了处理返回未命名列的情况。

    【讨论】:

    • 我没有使用 ->get() 因为我不希望结果集中的所有行一次都保存在内存中。我正在使用生成器,因此可以将行逐行附加到文件中。
    • 我强烈建议您改用chunk()。这会对结果进行分页并为您处理 PDO 废话。 laravel.com/api/5.1/Illuminate/Database/Eloquent/…
    • 我正在创建一个包含查询结果中所有记录的 CSV 文件。 chunk() 将为每个块重新运行查询。我正在努力使其尽可能高效。不过感谢您的建议。
    猜你喜欢
    • 1970-01-01
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多