【问题标题】:Laravel collection property staying the same in foreachLaravel 集合属性在 foreach 中保持不变
【发布时间】:2020-06-17 00:41:24
【问题描述】:

好的,这是我的问题。我有代码可以获取过去 24 小时内的 Walkaround 记录。 然后我在 foreach 中对它们进行迭代,对于每个 Walkaround,我都会迭代它的 ->questions 属性并为每个问题设置一个测试属性,这是我的代码:

$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 的不同属性,该属性会为问题和漫游拉回答案记录,我的实际使用面临同样的问题,我会得到正确问题的答案,但所有解决方法的所有答案都是相同的,因为每当我在Log::info 之外使用$walkaround->id 时,似乎在where()或者即使在这种情况下,只需设置一个测试属性,它就会使所有用法与 $walkaround->id 在最后一次循环迭代中的用法相同,因此即使所有遍历有不同的答案,它们看起来都一样。

这非常非常令人费解。当我在做这样的事情时:

$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;
    }
}

【问题讨论】:

  • @CBroe 您可以在 foreach 中更改 laravel 集合,它确实像这样工作。使用 ->map() 函数时也会出现同样的问题
  • @CBroe 例如,如果我执行 $question->test = $i++,则返回时 $walkarounds 中的 test 属性会按预期递增
  • 当您将其更改为内部循环外的$i = $walkaround-&gt;id; 和内部循环内的$question-&gt;test = $i; 时会发生什么?
  • @CBroe 同样的事情。 ->test 对 foreach 中最后一次遍历的 id 中的所有问题。我已经尝试了很多东西,从昨晚开始我一直在摸不着头脑,因为它没有意义
  • 您是否验证了 $walkarounds 在 foreach 循环之后包含的内容? 它被返回到其他地方之前?

标签: php laravel eloquent


【解决方案1】:

在尝试了一切之后,我决定采用这个似乎可行的解决方案。 它涉及将集合转换为数组:

$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();
    }
}

【讨论】:

    猜你喜欢
    • 2019-08-21
    • 1970-01-01
    • 2021-11-20
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 2020-08-30
    • 2018-09-22
    • 2020-07-11
    相关资源
    最近更新 更多