2017-01-11 4 views
1

Я очень новичок в Eloquent Я потратил часы на поиск, и я не могу найти точное решение моей проблемы.PHP/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); 

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

Выход:

[]

Я знаю, что я что-то отсутствует основной, но 'что', то есть я не знаю.

ответ

0

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

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

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

+0

Ты, мой друг, абсолютная звезда! Спасибо за это. Решила мою проблему сразу (и я кое-что узнал от нее!) Большое спасибо! – Techedemic

+0

Рад, что это помогло! @Techedemic. Собственно, я тоже узнал что-то новое. – shalvah

0

попробуйте напечатать ваш 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

Спасибо за ответ. Я не думаю, что проблема в моем запросе. Запрос работает отлично (согласно моему первому примеру, когда я повторяю результаты и получаю то, что ожидаю). Моя фактическая проблема заключается в переменном охвате, когда я выполняю функцию «каждый» ... но я не уверен, где – Techedemic

+0

ok .. Приятно видеть, что ваша проблема решена ... –