Collection-›put() не работает в Laravel 5.2

Я работаю с Laravel в первый раз. У меня есть сценарий, в котором у меня есть таблица «Продукты», которая содержит основные сведения о продукте (гофрокоробе), такие как длина, ширина, высота и т. д. Некоторые другие сведения о продукте вычисляются с использованием основных сведений внутри функции.

Мой код в контроллере выглядит так:

Контроллер:

$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() для не-объекта

Но согласно принятому ответу этот вопрос stackoverflow он должен работать . Что мне здесь не хватает?

Обновление:

Пробовал это

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


person Chandan D Nadig    schedule 27.07.2016    source источник


Ответы (3)


Вы получаете массив из 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());

Подробнее

person Martin    schedule 27.07.2016

Конструктор запросов не возвращает коллекцию при вызове get, он возвращает массив:

Как и необработанные запросы, метод get возвращает массив результатов, где каждый результат является экземпляром объекта PHP StdClass.

Если вам нужна коллекция Eloquent, вам нужно будет использовать модель Eloquent или использовать вспомогательную функцию collect(), как предлагает @Martin.

person Jeff Lambert    schedule 27.07.2016
comment
Ох, ладно. Виноват. Итак, как я могу добавить roll_size в массив $products ?? - person Chandan D Nadig; 27.07.2016
comment
Так же, как вы добавили бы что-то к любому другому массиву: $products['roll_size'] = $rollSize - person Jeff Lambert; 27.07.2016
comment
dd($product) внутри вашего цикла и обновите свой вопрос выводом. Также обратите внимание, что после выполнения этого цикла останется только один индекс roll_size. Возможно, вам придется переосмыслить свой дизайн, если вам нужен массив размеров рулона. - person Jeff Lambert; 27.07.2016
comment
В описании ошибки есть 'products' => array(object(stdClass), 'roll_size' => '1671'. Похоже, я добавляю массив к объекту. var_dump($products) говорит, что это объект - person Chandan D Nadig; 27.07.2016
comment
Вы правы, мистер Джефф. Я хочу получить доступ к $products->roll_size на мой взгляд..пожалуйста, предложите, как мне это сделать - person Chandan D Nadig; 27.07.2016

Метод put() устанавливает данные key и value в коллекцию:

вы пытаетесь сохранить объект массива в $rollSize.

В модели сделайте roll_size сериализованный объект, если вы хотите сохранить rollSize как массив в базе данных.

person Vaibhav    schedule 04.09.2016