简体   繁体   中英

How can I store barcode inside validate request in Laravel

I have a code on the store function where I save product details. However, the barcode always return empty. I don't know how to save it with Product::create($data);'. Can I ask some direction?

$data = new Product;
$data->name = $request->name;

Do I need to save one by one on an object such as the one above?

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Models\Product;
use Picqer;

class ProductsController extends Controller
{
    public function index() {
        $products = Product::orderBy('id')->get();
        return view('products.index', compact('products'));
    }

    public function show(Product $product) {
        return view('products.show', ['product' =>  $product]);
    }
    
    public function create() {
        $products = Product::all();
        return view('products.create', compact('products'));
    }

    public function edit(Product $product) {
        return view('products.edit', compact('product'));
    }

    public function update(Request $request, Product $product) {
        $request->validate([
            'code' => 'required',
            'barcode' => 'required',
            'name' => 'required',
            'description' => 'required|string|max:250',
            'unit' => 'required|int',
            'cost' => 'required',
            'srp' => 'required',
            'supplier' => 'required|string|max:250',
            'quantity_left' => 'required',
            'category' => 'required|string|max:250',
            'delivered_date' => 'required|date',
            'expiration_date' => 'required|date'
        ]);
        $product->code = $request->code;
        $product->barcode = $request->barcode;
        $product->name = $request->name;
        $product->description = $request->description;
        $product->unit = $request->unit;
        $product->cost = $request->cost;
        $product->srp = $request->srp;
        $product->supplier = $request->supplier;
        $product->quantity_left = $request->quantity_left;
        $product->category = $request->category;
        $product->delivered_date = $request->delivered_date;
        $product->expiration_date = $request->expiration_date;
        $product->save();
        return redirect()->route('products.index');
    }

    public function store(Request $request) {
        $code = $request->code;
        $generator = new Picqer\Barcode\BarcodeGeneratorHTML();
        $barcode = $generator->getBarcode($code, $generator::TYPE_CODE_128);
        
        $data = $request->validate([
            'code' => 'required',
            'barcode' => 'max:15|nullable',
            'name' => 'required',
            'description' => 'required|string|max:250',
            'unit' => 'required|int',
            'cost' => 'required',
            'srp' => 'required',
            'supplier' => 'required|string|max:250',
            'quantity_left' => 'required',
            'category' => 'required|string|max:250',
            'delivered_date' => 'required|date',
            'expiration_date' => 'required|date'
        ]);


        Product::create($data);

        return redirect()->route('products.index')->with('success', 'Product has been added!');
    }

    public function destroy(Product $product) {
        $product->delete();
        return back();
    }
}

I think I just missed something. I've used this framework: https://github.com/picqer/php-barcode-generator

You need to overwrite the barcode coming from request with the one you generated.


    $product = new Product();
    $product->name = 'some name';
    ...
    $product->barcode = $barcode;
    $product->save();

I made this work by merging the two arrays:

$data = array_merge($data, ['barcode' => $barcode]);
Product::create($data);

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM