1

Использование Maatwebsite для загрузки файла Excel в базу данных.Возврат данных с анонимной функции

Каждая строка имеет тип недвижимости, например «пентхаус» или «вилла».

Я хочу собрать каждый тип свойства каждой строки.

Используя следующую функцию не будет работать:

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()); 
    } 
}); 

с определением $this->property_types в функции __construct как:

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-> 'указывает на колдуну Instance ?? – JustOnUnderMillions

ответ

1

Проблема заключается в том, что по умолчанию метод chunk() будет обрабатывать анонимную функцию асинхронно внутри очереди. Поскольку функция выполняется рабочим внутри очереди, у вас не будет синхронного доступа к любой из данных, которые она обрабатывает в коде, который вызывает метод chunk().

Вы можете предотвратить использование очереди, перейдя в false в качестве третьего параметра в метод chunk().

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

В качестве дополнительного примечания, вы звоните truncate() внутри обратного вызова. Я не знаю, было ли это намеренно, но это урезает ваш стол на каждом обработанном куске.

+0

Отлично работает и, действительно, спасибо за комментарий о 'truncate() 'функция. – Liam

Смежные вопросы