С помощью 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 = [];
}
Это приведет к пустому массиву.
Как указано Вот, определяя массив и 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());
}
});
Что мне нужно сделать, чтобы определить данные внутри анонимной функции и получить данные вне функции?
Проблема в том, что по умолчанию chunk()
Метод будет обрабатывать вашу анонимную функцию асинхронно внутри очереди. Поскольку эта функция выполняется рабочим внутри очереди, у вас не будет синхронного доступа к каким-либо данным, которые она обрабатывает в коде, который вызывает chunk()
метод.
Вы можете предотвратить использование очереди, передав false
в качестве третьего параметра к chunk()
метод.
Excel::filter('chunk')
->load($csv->getRealPath())
->chunk(250, function ($results) {
/* your code */
}, false);
В качестве дополнительного примечания вы звоните truncate()
внутри вашего обратного вызова. Я не знаю, было ли это преднамеренно, но это укроет вашу таблицу на каждом обработанном фрагменте.
Других решений пока нет …