Collection-> put()在Laravel 5.2中不起作用

时间:2016-07-27 15:38:26

标签: php laravel-5.2 laravel-collection

我第一次和Laravel合作。我有一个场景,我有一个产品表,其中包含产品(瓦楞纸箱)的基本细节,如长度,宽度,高度等。产品的其他一些细节是使用功能中的基本细节计算的。

我在Controller中的代码如下所示:

控制器:

$products = DB::table('master_products')
            ->join('part_types', 'master_products.part_type_id', '=', 'part_types.id')
            ->join('box_types', 'master_products.box_type_id', '=', 'box_types.id')
            ->select('master_products.*', 'part_types.part_type', 'box_types.box_type')
            ->get();

    /* Calculate Specs and add them to the collection */
    foreach ($products as $product) {
        $rollSize = $this->calcRollSize($product->height, $product->breadth, $product->ply, $product->part_type_id, $product->box_type_id);
        $products->put('roll_size', $rollSize); 
    }

return view('/layouts/masters/products-master', ['products' => $products]);

查看:

<table class="table table-bordered table-condensed table-hover">
            <thead>
                <tr>
                    <th>Sl.No.</th>
                    <th>Product Code</th>
                    <th>Part Type</th>
                    <th>Box Type</th>
                    <th>Length</th>
                    <th>Breadth</th>
                    <th>Height</th>
                    <th>Ply</th>
                    <th>Roll Size</th>
                    <th>A-Base</th>
                    <th>A-Flute</th>
                    <th>B-Base</th>
                    <th>B-Flute</th>
                    <th>Top</th>
                </tr>
            </thead>
            <tbody>                    
                @foreach($prod_specs as $prod_spec)
                <tr>
                    <td><?php echo $i; ?></td>
                    <td><?php echo $prod_spec->product_code; ?></td>
                    <td><?php echo $prod_spec->part_type; ?></td>
                    <td><?php echo $prod_spec->box_type; ?></td>
                    <td><?php echo $prod_spec->length; ?></td>
                    <td><?php echo $prod_spec->breadth; ?></td>
                    <td><?php echo $prod_spec->height; ?></td>
                    <td><?php echo $prod_spec->ply; ?></td>
                    <td><?php echo $prod_spec->roll_size; ?></td>
                    <td><?php echo $prod_spec->gsm_a_base; ?></td>
                    <td><?php echo $prod_spec->gsm_a_flute; ?></td>
                    <td><?php echo $prod_spec->gsm_b_base; ?></td>
                    <td><?php echo $prod_spec->gsm_b_flute; ?></td>
                    <td><?php echo $prod_spec->gsm_top; ?></td>
                </tr>
                <?php $i++; ?>
                @endforeach
            </tbody>
        </table>

我遇到了这个例外:在非对象上调用成员函数put()

但根据this stackoverflow question已接受的答案,它应该起作用。我在这里缺少什么?

更新

试过这个

foreach ($products as $product) {
    $rollSize = $this->calcRollSize($product->height, $product->breadth, $product->ply, $product->part_type_id, $product->box_type_id);
    $product['roll_size'] = $rollSize; 
}

出现错误 Cannot use object of type stdClass as array

3 个答案:

答案 0 :(得分:1)

您从Query Builder获取数组。 Laravel collect()帮助程序是您的解决方案:

$products = collect(DB::table('master_products')
            ->join('part_types', 'master_products.part_type_id', '=', 'part_types.id')
            ->join('box_types', 'master_products.box_type_id', '=', 'box_types.id')
            ->select('master_products.*', 'part_types.part_type', 'box_types.box_type')
            ->get());

More info

答案 1 :(得分:0)

Query Builder在调用get时没有返回集合,它返回一个数组:

  

与原始查询一样,get方法返回一个结果数组,其中每个结果都是PHP StdClass对象的一个​​实例。

如果你想要一个Eloquent集合,你将需要使用一个Eloquent模型或使用@Martin建议的collect()辅助函数。

答案 2 :(得分:0)

put()方法设置集合中的给定keyvalue

您正试图在$rollSize中保存数组对象。

如果要将roll_size作为数组存储在数据库中,请在模型make rollSize序列化对象中。