繁体   English   中英

Eloquent ORM查询数据库时数组索引的问题

[英]Problem of array index when querying the database with 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;
    }

抛出的异常如下: 在此处输入图片说明

当我添加变量时,我得到了这个。

  • 对于 $item->nutritionalValue :

在此处输入图片说明

  • 对于 $item->nutritionalValue['calories'] :

在此处输入图片说明

  • 对于 $nutritionalValues :

在此处输入图片说明

我不明白的是 $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:问题解决了!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM