Laravel свойство коллекции остается неизменным в foreach - PullRequest
0 голосов
/ 04 марта 2020

Хорошо, вот моя проблема. У меня есть код для получения записей Walkaround за последние 24 часа. Затем я перебираю их в foreach и для каждого Walkaround я перебираю его свойство ->questions и задаю свойство test для каждого вопроса, вот мой код:

$walkarounds = Walkaround::where('driver_id', $request->user()->id)->with(
    [
        'questionnaire' => function ($q) {
            $q->with(
                [
                    'questions'
                ]
            );
        }
    ]
)->get();

foreach ($walkarounds as $walkaround) {
    $i = 0;
    foreach($walkaround->questionnaire->questions as $question) {
        Log::info($walkaround->id);
        $question->test = $walkaround->id;
    }
}

return $walkarounds;

Проблема в том, что в моем laravel.log, правильный $ walkaround-> id регистрируется так:

> [2020-03-04 13:28:37] development.INFO: [WalkaroundsController@index -
> L:50] 20   [2020-03-04 13:28:37] development.INFO:
> [WalkaroundsController@index - L:50] 20   [2020-03-04 13:28:37]
> development.INFO: [WalkaroundsController@index - L:50] 20  
> [2020-03-04 13:28:37] development.INFO: [WalkaroundsController@index -
> L:50] 21   [2020-03-04 13:28:37] development.INFO:
> [WalkaroundsController@index - L:50] 21   [2020-03-04 13:28:37]
> development.INFO: [WalkaroundsController@index - L:50] 21  
> [2020-03-04 13:28:37] development.INFO: [WalkaroundsController@index -
> L:50] 22   [2020-03-04 13:28:37] development.INFO:
> [WalkaroundsController@index - L:50] 22   [2020-03-04 13:28:37]
> development.INFO: [WalkaroundsController@index - L:50] 22  
> [2020-03-04 13:28:37] development.INFO: [WalkaroundsController@index -
> L:50] 23   [2020-03-04 13:28:37] development.INFO:
> [WalkaroundsController@index - L:50] 23   [2020-03-04 13:28:37]
> development.INFO: [WalkaroundsController@index - L:50] 23  
> [2020-03-04 13:28:37] development.INFO: [WalkaroundsController@index -
> L:50] 24   [2020-03-04 13:28:37] development.INFO:
> [WalkaroundsController@index - L:50] 24   [2020-03-04 13:28:37]
> development.INFO: [WalkaroundsController@index - L:50] 24  
> [2020-03-04 13:28:37] development.INFO: [WalkaroundsController@index -
> L:50] 25   [2020-03-04 13:28:37] development.INFO:
> [WalkaroundsController@index - L:50] 25   [2020-03-04 13:28:37]
> development.INFO: [WalkaroundsController@index - L:50] 26  
> [2020-03-04 13:28:37] development.INFO: [WalkaroundsController@index -
> L:50] 26   [2020-03-04 13:28:37] development.INFO:
> [WalkaroundsController@index - L:50] 26   [2020-03-04 13:28:37]
> development.INFO: [WalkaroundsController@index - L:50] 27  
> [2020-03-04 13:28:37] development.INFO: [WalkaroundsController@index -
> L:50] 27

Однако в возвращенном $walkarounds каждый walkaround->questionnaire->questions->test является тем же значением, даже если оно явно зарегистрировано как отличающееся.

Я знаю, что это бессмысленное использование, так как у меня уже есть объем walkaround_id в каждом обходе как id, на самом деле я пытаюсь установить другое свойство с именем answer при получении записи Ответа для вопроса и обхода, мое реальное использование столкнулось с той же проблемой, когда я получил ответ на правильный вопрос, но все ответы для всех обходов были одинаковыми, потому что, кажется, всякий раз, когда я использую $walkaround->id за пределами Log::info, в where() или даже в этом случае, просто устанавливая свойство test, он делает все использования такими же, как $walkaround->id в последней итерации l oop Поэтому, несмотря на то, что у всех обходов были разные ответы, все они выглядели одинаково.

Это очень, очень удивительно. Когда я делал что-то вроде этого:

$question->answer = Answer::where('question_id', $q->id)->where('walkaround_id', $walkaround->id)->with('defects')->first();

Я даже отключил используемую sql, и все запросы выполнялись с правильным walkaround_id

Если я настроил тест переменная типа $i и увеличивается для каждого обхода и использует его как walkaround_id, он будет работать.

Что здесь происходит? Это очень странно.

Я также пробовал это:

for ($i = 0; $i < count($walkarounds); $i++) {
    for ($n = 0; $n < count($walkarounds[$i]->questionnaire->questions); $n++) {
        $walkarounds[$i]->questionnaire->questions[$n]->test = $walkarounds[$i]->id;
    }
}

1 Ответ

0 голосов
/ 04 марта 2020

Попробовав все, я решил go для этого решения, которое, кажется, работает. Это включает приведение коллекции к массиву:

$last24HrWalkarounds = Walkaround::where('driver_id', $request->user()->id)
    ->where('company_id', $company->id)
    ->where('started_at', '>', $formattedDate)
    ->orderBy('id', 'DESC')
    ->with(
        [
            'questionnaire' => function ($q) {
                $q->with(
                    [
                        'questions'
                    ]
                );
            }
        ]
    )
    ->get()->toArray();

for ($i = 0; $i < count($last24HrWalkarounds); $i++) {
    for ($n = 0; $n < count($last24HrWalkarounds[$i]['questionnaire']['questions']); $n++) {
        $last24HrWalkarounds[$i]['questionnaire']['questions'][$n]['answer'] = Answer::
        where('question_id', $last24HrWalkarounds[$i]['questionnaire']['questions'][$n]['id'])
            ->where('walkaround_id', $last24HrWalkarounds[$i]['id'])->first();
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...