Возврат данных из анонимной функции

С помощью 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());
}
});

Что мне нужно сделать, чтобы определить данные внутри анонимной функции и получить данные вне функции?

1

Решение

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

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

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

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

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]