Массив не добавляется к переменной в цикле foreach - PullRequest
0 голосов
/ 30 августа 2018

Наткнулся на странную проблему, и я выдернул ей волосы.

У меня есть этот цикл foreach

$rubrics = ReaderRubric::where('cycle_subpool_id', "=", $cycle_subpool_id)->get();
foreach ($rubrics as &$rubric) {
    $answers = ReaderRubricAnswer::where('rubric_id', "=", $rubric->rubric_id)->get();
    $rubric['answers'] = $answers;
}

unset($rubric);

Log::info($rubrics);
return $rubrics;

Журнал $rubrics

[{"rubric_id":1,"reader_type":24,"document_type":"0","title":"test","question":"qweqwe","activity_type":null},{"rubric_id":2,"reader_type":21,"document_type":"0","title":"test","question":"testing","activity_type":null}]

Лог $rubric['answer'] в цикле

[{"answer_id":5,"rubric_id":2,"text":"asn 1","value":1},{"answer_id":6,"rubric_id":2,"text":"ans 2","value":2},{"answer_id":7,"rubric_id":2,"text":"ans 3","value":3}]

var_dump ($ рубрики);

object(Illuminate\Database\Eloquent\Collection)#74 (1) {
  ["items":protected]=>
  array(2) {
    [0]=>
    object(Entrada\Modules\Admissions\Models\Entrada\ReaderRubric)#75 (26) {
      ["dateFormat":protected]=>
      string(1) "U"
      ["connection":protected]=>
      string(16) "entrada_database"
      ["table":protected]=>
      string(24) "admissions_reader_rubric"
      ["primaryKey":protected]=>
      string(9) "rubric_id"
      ["fillable":protected]=>
      array(5) {
        [0]=>
        string(11) "reader_type"
        [1]=>
        string(13) "document_type"
        [2]=>
        string(5) "title"
        [3]=>
        string(8) "question"
        [4]=>
        string(13) "activity_type"
      }

Если я проверю журналы на $rubrics и $rubric['answers'], это точно так, как и должно быть.

Однако, если я дам дамп $rubrics, ни у одного из них не будет $rubric['answers'].

Я знаю, что это что-то простое, я просто слишком долго смотрел на него, чтобы увидеть это сейчас.

Спасибо!

Ответы [ 2 ]

0 голосов
/ 30 августа 2018

$rubrics это не массив, это объект, который реализует массив Traversable, поэтому вы можете перебирать его.

Вы можете сделать так, чтобы ваш цикл помещал элементы в реальный массив.

$rubrics_array = [];
foreach ($rubrics as $rubric) {
    // do stuff to $rubric
    // ...
    $rubrics_array[] = $rubric;
}

С этого момента используйте $rubrics_array вместо $rubrics.

0 голосов
/ 30 августа 2018

Когда вы работаете с обычными массивами PHP, есть несколько способов справиться с этим. Но поскольку у вас есть Collection, поведение, подобное массиву, не работает. Я думаю, что этого маленького обходного пути должно быть достаточно, чтобы заставить работать «магические» геттеры / сеттеры:

foreach ($rubrics as $key => $rubric) {
  $answers = ReaderRubricAnswer::where('rubric_id', "=", $rubric->rubric_id)->get();
  $rubric['answers'] = $answers;
  $rubrics[$key] = $rubric;
  Log::info($rubrics[$key]['answers']);
 }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...