间接修改重载属性App \ Category :: $ thesizes无效

时间:2016-07-19 15:00:02

标签: php laravel

对于网店我试图生成一个看起来像这样的表:

Tablename: category 1
productname     S   M   L   X  total
name1           1    0  1   3  5
name2           0    1  0   2  3


Tablename: category 2
productname     S   L   X  total
name5           1   1   3  5
name8           0   0   2  2

每个类别都有一个表格,每个类别都有自己的大小(例如,表格2没有大小M)。 表格显示了每个类别中每种产品每种尺寸的订购产品数量。

在应用程序中有一个模型 OrderProducts ,它们是每个订单中的订购产品。

OrderProduct 有一个 ProductSize ,它是产品尺寸的联结表

ProductSize 尺寸(包含尺寸名称)

我要做的第一步是获得每个类别的所有尺寸/产品,如:

    $order = Order::findOrFail($id);
    $products = OrderProduct::where('orders_id',$id)->get();

    $categories = Category::all();
    //get sizes and products per category
    foreach($categories as $cat)
    {
        $cat->thesizes= array();
        $cat->theprodcts= array();
        foreach($products as $product)
        {
            if($product->productSize->product->category_id == $cat->id)
            {
                array_push($cat->thesizes,$product->productSize);
                array_push($cat->theprodcts,$product);
            }

        }
        //make sure all values are unique (no dubbele sizes).
        $cat->theSizes = array_unique($cat->theSizes);
        $cat->theProducts = array_unique($cat->theProducts);
    }

当我运行我的代码时,我收到以下错误:

  

间接修改重载属性App \ Category :: $ thesizes   没有效果

为什么我会收到此错误,我该如何解决?

3 个答案:

答案 0 :(得分:13)

这是因为您的Category班级已实施__get()__set() magic methods

因此,第7行($cat->thesizes= array();)调用Category::__set(),第12行(array_push($cat->thesizes,$product->productSize);)调用Category::__get() 但不调用 Category::__set()。因此,虽然您想要将值推送到您在类别上设置的数组,但由于array_push()正在处理返回值而不是存储在类别中的实际数组,因此它无法工作。

有几种方法可以解决这个问题。最简单的方法是更改​​Category::__get()以通过引用返回值,这是通过对函数的返回声明使用排序类型提示来完成的

class Category
{
    public function &__get($key) {
        // body of function
    }
}

但是如果你有点好奇的话,可能不会推荐这个。

更明智的方法,至少在没有显着修改代码的情况下,是在循环范围内构建数组,然后将它们添加到Category个对象

foreach ($categories as $cat) {
    // Scope local arrays here first
    $thesizes = array();
    $theproducts = array();

    foreach ($products as $product) {
        if ($product->productSize->product->category_id == $cat->id) {
            // Push to those local arrays
            array_push($thesizes, $product->productSize);
            array_push($theprodcts, $product);
        }
    }

    // Now assign them to the category object
    $cat->theSizes = array_unique($thesizes);
    $cat->theProducts = array_unique($theproducts);
}

如果你想获得奖励积分,因为这是Laravel,你的回报值是collections,你可以做一些类似的事情来实现更复杂的实施

$categories = (Category::all())->map(function(Category $cat) {
    $cat->theProducts = $products
        ->filter(function(Product $product) use ($cat) {
            return $product->productSize->product->category_id == $cat->id;
        })
        ->unique();

    $cat->theSizes = $cat->theProducts
        ->map(function(Product $product) {
            return $product->productSize();
        })->unique();
});

答案 1 :(得分:0)

以下技巧对我有用

public function methods(){
     //other logics
     ...
    $result = json_decode(json_encode($result));

    $result->someProp = (object)[];
    $result->someProp->another = 'test';

    return response()->json($result);
}

答案 2 :(得分:0)

发生错误的原因是,当您将array_push到类别对象的对象时,尽管该字段可能是一个数组,但是它位于一个对象中,您必须将字段保存到数组变量,然后将array_push保存到该变量,然后然后以json字符串的形式返回字段