首页 > 解决方案 > 奇怪的雄辩行为:如果条件在 foreach 内,则不起作用

问题描述

我有下一个代码:

$list = SparePartApplicationPositionProvider::where('app_id',$app_id)->with(['provider','application_position'])->orderBy('apos_id')
->get();

它按位置显示提供者,所有工作都很好。

我想更改一些值,在这种情况下它可以工作:

foreach ($list as $value) {
            if(($value->id > 3)){
                $value->enter_price=3141592;
            };
        }

但在这种情况下它不起作用

    if($value->id > 3){

        if($value->application_position->id == 26){
           $value->application_position->name_detail='test';
       }

   };

它不会“看到” ($value->id > 3) 条件,仅适用于 ($value->application_position->id == 26) 条件。怎么修?

标签: phplaravellaravel-5eloquent

解决方案


在这种情况下,

$value->application_position;

将尝试application_position通过$value魔法访问。这将返回 null,因此您的if函数将返回 false。

所以你需要做的就是像函数一样调用它,并id在你遍历集合时访问

$value->application_position();

所以你的代码应该是这样的

if($value->id > 3){
    $positions = $value->application_position();
    foreach($positions as $position){
        if($position->id == 26){
           $position->name_detail = 'test';
        }
    }
};

推荐阅读