1

Maatwebsiteを使用して、データベースにExcelファイルをアップロードします。匿名関数からデータを返します

すべての行にプロパティタイプがあります(例: 'penthouse'または 'villa')。

すべての行のすべてのプロパティタイプを収集したいと思います。

次の関数を使用すると、動作しません。

Excel::filter('chunk')->load($csv->getRealPath())->chunk(250, function ($results) { 
    DB::table('prices')->truncate(); 

    foreach ($results as $row) { 
     /** 
     * @var CellCollection $row 
     */ 

     array_push($this->property_types, $row->property_type); 

     $price = Price::create($row->all()); 
    } 
}); 

よう__construct機能で$this->property_typesを定義して:これは空の配列になります

public function __construct() 
{ 
    $this->middleware('auth'); 

    $this->property_types = []; 
} 

hereのように、配列を定義してusingにアンパサンドを指定すると問題が解決する可能性がありますが、これは空の配列と同じ結果を返します。

$data = []; 

Excel::filter('chunk')->load($csv->getRealPath())->chunk(250, function ($results) use (&$data) { 
    DB::table('prices')->truncate(); 


    foreach ($results as $row) { 
     /** 
     * @var CellCollection $row 
     */ 

     array_push($data, $row->property_type); 

     $price = Price::create($row->all()); 
    } 
}); 

匿名関数内でデータを定義し、関数外のデータを取得するにはどうすればよいですか?

+0

どのバージョンのPHPを使用しますか? –

+0

'匿名関数からデータを返し、'無名関数で 'return $ something;') – JustOnUnderMillions

+0

'$ this->'はインスタンスを魔法にしますか? – JustOnUnderMillions

答えて

1

デフォルトでは、chunk()メソッドは、匿名関数をキュー内で非同期的に処理するという問題があります。この関数はキュー内のワーカーによって実行されているため、chunk()メソッドを呼び出すコードで処理するデータに同期アクセスすることはできません。

chunk()メソッドの3番目のパラメータとしてfalseを渡すことで、キューの使用を防ぐことができます。追加の注意点として

Excel::filter('chunk') 
    ->load($csv->getRealPath()) 
    ->chunk(250, function ($results) { 
     /* your code */ 
    }, false); 

、あなたはコールバック内部truncate()を呼んでいます。これが意図的なものかどうかはわかりませんが、処理されたすべてのチャンクでテーブルが切り捨てられます。

+0

完全に動作し、実際には、 'truncate()関数に関するコメントのおかげで、' - > chunk(250、function($ results)use(&$ data){/ * your code * /}、false) '関数。 – Liam

関連する問題