首页 > 解决方案 > Eloquent ORM查询数据库时数组索引的问题

问题描述

运行此方法时遇到问题:

    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 关系来获取营养价值,这是与成分的关系。

谢谢您的帮助 !

编辑:我在循环内调用函数:

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:问题解决了!

标签: phplaravel

解决方案


在不知道方法的范围和上下文的情况下,访问属性的最安全方法是$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;
}

推荐阅读