Проблема индекса массива при запросе базы данных с помощью Eloquent ORM - PullRequest
2 голосов
/ 22 января 2020

У меня проблема при запуске этого метода:

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

Исключением является следующее: enter image description here

Когда я изменяю переменные I получил это.

  • Для $ item-> nutritionalValue:

enter image description here

  • Для $ item- > nutritionalValue ['calories']:

enter image description here

  • Для $ nutritionalValues:

enter image description here

Что я не понимаю, так это то, что $ item-> nutritionalValue ['calories'] правильно указан как dd, но консоль сообщает мне, что индекс калорий не может быть найден. Также странным является то, что для строки не выдается никаких исключений:

$nutritionalValues['weight'] = $nutritionalValues['weight'] + $item->nutritionalValue['weight'];

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

Спасибо за помощь!

Редактировать: я вызываю функцию внутри al oop:

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

А теперь у меня ошибка: enter image description here

Я не понимаю, как это возможно, потому что каждый массив, отправленный этому методу, одинаков ...

Редактировать 2: Проблема решена!

1 Ответ

2 голосов
/ 22 января 2020

Не зная области действия и контекста вашего метода, самый безопасный способ доступа к атрибутам - $item->nutritionalValue->attributes['calories'], et c. Дополнительная информация: https://laravel.com/docs/6.x/eloquent-mutators#attribute -кастинг

Почему 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...