【发布时间】: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->id;和内部循环内的$question->test = $i;时会发生什么? -
@CBroe 同样的事情。 ->test 对 foreach 中最后一次遍历的 id 中的所有问题。我已经尝试了很多东西,从昨晚开始我一直在摸不着头脑,因为它没有意义
-
您是否验证了 $walkarounds 在 foreach 循环之后包含的内容? 在它被返回到其他地方之前?