2016-05-02 8 views
2

私は経験の浅いLaravelの開発者です。私が得意なクエリ結果には戸惑います。私は、CSVファイルにクエリの結果に書き込もうとしています。私のコード:Laravelがexecute()を呼び出して重複した結果を返すのはなぜですか?

$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); 

代わりに、列ごとに1つの結果を得るための、私はそうのように、列名と数値インデックスとキー1とキー2つを得る:

「first_nameの」=>「ジェーン'、0 =>' Jane '、' agent_id_from_website '=>' 450 '、1 =>' 450 '、' sales_manager_id '=> 317,2 => 317、' last_name '=>' Doe '、3 =>' Doe '

なぜ結果が重複していますか?明らかに私は重複を無視することができますが、PHP、Laravel、またはPostgresがこのように処理する理由については非常に興味があります。

答えて

0

なぜあなたはやっていません->get()?これがPHP PDOの仕組みなので、あなたは奇妙な結果を得ています。これらの\Illuminate\DBメソッドは、基本的にPDOに直接触れています。

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

それは連続した値と文の指定された名前の両方を返します。これはおそらく、名前のない列が返されるインスタンスを処理するためです。

+0

私は結果セットのすべての行を一度にメモリに保持したくないので、> get()を使用していません。私はジェネレータを使用しているので、行をファイルごとに行単位で追加することができます。 – brianfr82

+0

代わりに 'chunk()'を使うことを強くお勧めします。これにより結果がページングされ、PDOのナンセンスが処理されます。 https://laravel.com/api/5.1/Illuminate/Database/Eloquent/Builder.html#method_chunk – Josh

+0

私はクエリ結果のすべてのレコードを含むCSVファイルを作成しています。 chunk()は各チャンクに対してクエリを再実行します。私はこれをできるだけ実行可能なものにしようとしています。しかし、提案をありがとう。 – brianfr82

関連する問題