массивы — PHP / Eloquent — перебирать коллекцию и устанавливать переменные вне области видимости

Я очень плохо знаком с Eloquent. Я потратил часы на поиски и не могу найти точное решение своей проблемы.

У меня есть следующая модель:

use Illuminate\Database\Eloquent\Model as Eloquent;
use Illuminate\Support\Collection;

class Answer extends Eloquent
{
protected $table = 'tbl_answers';

protected $fillable = [
'method',
'thoughts',
'location'
];

public function getMethodsStats()
{
$methods = Answer::selectRaw('*, count(*) AS method_count')- >groupBy('method');
return $methods;
}
}

В моем контроллере я пытаюсь перебрать результаты, чтобы просто отобразить результаты на экране.
Это работает:

$methods = $app->answer->getMethodsStats();

$methods->each(function($method, $key)
{
echo " --- Method: " . $method->method . " - " . $method->method_count;
});

Результат, как и ожидалось:

— Метод: сложить — 3 — Метод: сложить — 2

Чтобы упростить процесс, я хочу заполнить массив этими значениями. Этот массив должен быть доступен за пределами «каждой» функции, как только это будет сделано.

Код:

$methods = $app->answer->getMethodsStats();
$stats = new array();

$methods->each(function($method, $key) use ($stats)
{

$stats[$method->method] = $method->method_count;
});

echo json_encode($stats);

Это не работает, как я хотел. Я просто получаю пустой массив.

Выход:

[]

Я знаю, что упускаю что-то простое, но «что», то есть я не знаю.

1

Решение

По умолчанию PHP передает аргументы функции по значению. Вы проходите копия из $statsк вашей функции. Вместо этого вам нужно передать его по ссылке, чтобы функция могла его изменить. Сделайте это, добавив & перед переменной, вот так:

$methods->each(function($method, $key) use (&$stats) { ... });
echo json_encode($stats);

Стоит проверить:

1

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

попробуйте сначала распечатать запрос MySQL, используя ->toSql()

лайк

    echo $methods = Answer::selectRaw('*, count(*) AS method_count')- >groupBy('method')->toSql();

die();
and check if you are getting the correct query to execute.

затем после попытки
менять

$methods = Answer::selectRaw('*, count(*) AS method_count')- >groupBy('method');
return $methods;

в

 $methods = Answer::select(DB::Raw('*'), DB::Raw('count(*) AS method_count)')->groupBy('method');
return $methods;
0

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