Laravel:在foreach循环中进行咨询不起作用

时间:2018-04-06 14:09:58

标签: php laravel

我不知道我做错了什么,我有一个foreach循环和里面的咨询,当我试图通过该对象获取数据时,它说它和非对象我不能得到数据。

public function actualizar_costo_promedio()
    {
        $empresas = Empresa::all();

        $anteriores_exist = 0;
        foreach ($empresas as $empresa) {

            $producto = $empresa->productos()->where('producto_nombre_id', 1)->first();
            $anteriores_exist += $producto->existencias;
        }
     }

如果我这样做,它会给我这个错误,但是如果我只更改$producto = $empresa->productos()->first();的位置就可以了

我已经使用$empresa = Empresa::find(1);进行了其他测试,经过咨询$producto = $empresa->productos()->where('producto_nombre_id', 1)->first();并且也有效,所以我不明白它的错误

1 个答案:

答案 0 :(得分:0)

所以让我告诉你这是什么问题,这段代码:

$empresas = Empresa::all();

返回一个集合或数组数组。

现在,当你正在进行预告时,你正在试图Empresa,但是你正在访问一段关系

$empresa->productos() 

从错误中我可以判断它是一对多的关系,因为它发生了错误,因为它返回你的另一个集合的关系,你试图访问一个抛出错误的属性。

但是当你拿起集合中的第一个项目时,你实际上访问了包含所有数组的数组中的第一个arrray!因此,它的工作:

$producto = $empresa->productos()->where('producto_nombre_id', 1)->first();

因此,如果你想让它工作,你需要在foreach中进行另一次iterration,或者正如我能够正确理解你想要获得现有产品Empresa你能做到的:

$anteriores_exist = $empresas->map(function($row){

    $products = $row->productos()->where('id', 1)->get();

    return $products->filter(function($row){
        return $row->existencias;
    });
});