Я очень плохо знаком с 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);
Это не работает, как я хотел. Я просто получаю пустой массив.
Выход:
[]
Я знаю, что упускаю что-то простое, но «что», то есть я не знаю.
По умолчанию PHP передает аргументы функции по значению. Вы проходите копия из $stats
к вашей функции. Вместо этого вам нужно передать его по ссылке, чтобы функция могла его изменить. Сделайте это, добавив &
перед переменной, вот так:
$methods->each(function($method, $key) use (&$stats) { ... });
echo json_encode($stats);
Стоит проверить:
попробуйте сначала распечатать запрос 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;