このメソッドを実行すると問題が発生します:
public function getNutritionalValuesPerMeal($item,$nutritionalValues){
foreach (array($nutritionalValues) as $key => $value) {
if (array_key_exists($key, $item->nutritionalValue->attributes)) {
$nutritionalValues[$key] += $item->nutritionalValue->attributes[$key];
}
}
return $nutritionalValues;
}
変数をddすると、これが得られました。
私が理解していないのは、$ item-> nutritionalValue ['calories']が正しくddであるのに、コンソールがカロリーのインデックスが見つからないと言っていることです。奇妙なことは、その行に例外がスローされないことです。
$nutritionalValues['weight'] = $nutritionalValues['weight'] + $item->nutritionalValue['weight'];
私はEloquent関係を使用して、成分との関係であるnutritionalValueをフェッチします。
助けてくれてありがとう !
編集:ループ内で関数を呼び出しています:
public function getNutritionalValuesPerDay($mealNutritionalValues,$items,$day){
foreach($items as $item){
switch ($item->pivot->meal) {
case "Breakfast":
$mealNutritionalValues["Breakfast"] = $this->getNutritionalValuesPerMeal($item,$mealNutritionalValues["Breakfast"]);
break;
case "Snack 1":
$mealNutritionalValues["Snack 1"] = $this->getNutritionalValuesPerMeal($item,$mealNutritionalValues["Snack 1"]);
break;
case "Lunch":
$mealNutritionalValues["Lunch"] = $this->getNutritionalValuesPerMeal($item,$mealNutritionalValues["Lunch"]);
break;
case "Snack 2":
$mealNutritionalValues["Snack 2"] = $this->getNutritionalValuesPerMeal($item,$mealNutritionalValues["Snack 2"]);
break;
case "Dinner":
$mealNutritionalValues["Dinner"] = $this->getNutritionalValuesPerMeal($item,$mealNutritionalValues["Dinner"]);
break;
}
}
return $mealNutritionalValues;
}
このメソッドに送信される各配列は同じであるため、これがどのように可能かわかりません...
編集2:問題は解決しました!
メソッドのスコープとコンテキストを知らなくても、属性にアクセスする最も安全な方法は$item->nutritionalValue->attributes['calories']
、などです。詳細:https://laravel.com/docs/6.x/eloquent-mutators#attribute-casting
なぜdd()
その属性にアクセスできるのですか?それは、オブジェクトに対してdd()
ある種のget()
メソッドを実行するためです。
それとは別に、私はあなたのメソッドを次のようにリファクタリングします:
public function getNutritionalValuesPerMeal($item, $nutritionalValues)
{
foreach ($nutritionalValues as $key => $value) {
if (array_key_exists($key, $item->nutritionalValue->attributes)) {
$nutritionalValues[$key] += $item->nutritionalValue->attributes[$key];
}
}
return $nutritionalValues;
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加