Передать динамическое значение в правило проверки Laravel max - PullRequest
2 голосов
/ 05 октября 2019

Я работаю над формой сбора продаж, в которой sale_quantity , введенное , не должно превышать stock_quantity в DB . Когда я использую идею в: Laravel проверяет динамически добавленный ввод с пользовательскими сообщениями , есть один ответ с:

'orderQty.*' => 'required|numeric|min:1|max:'.$product['productQty']

Я сделал это, как вы увидите в моей функции store и обновление функции в SalesController.php, ошибка не возникает , но форма отказывается отправлять и показывает это какфлэш-сообщение:

Объем продажи не может превышать '. $ stocks [' stock_quantity '].

Это не означает, что он показывает, потому что их значение stock_quanity в базе данных больше.

SalesController.php

<?php

namespace App\Http\Controllers;

use Illuminate\Support\Facades\DB;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use App\Sale;
use App\Stock;

class SalesController extends Controller
{
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    function __construct()
    {
        $this->middleware('permission:sales-list');
        $this->middleware('permission:sales-create', ['only' => ['create', 'store']]);
        $this->middleware('permission:sales-edit', ['only' => ['edit', 'update']]);
        $this->middleware('permission:sales-delete', ['only' => ['destroy']]);
}

/**
 * Display a listing of the resource.
 *
 * @return \Illuminate\Http\Response
 */
public function index()
{
    $sales = Sale::orderBy('updated_at', 'desc')->get();
    return view('sales.index')->with('sales', $sales);
}

/**
 * Show the form for creating a new resource.
 *
 * @return \Illuminate\Http\Response
 */
public function create()
{
    $stocks = Stock::all();
    //dd($stocks);
    return view('sales.create', compact('stocks'));
    //$sales = Sale::pluck('stock_id')->prepend('stock_id');
    //$sales = DB::table('stocks')->select('stock_id')->get();
    //return view('sales.create')->with('sales',$sales);
}

public function getUnitSellingPrice(Request $request, $stock_name)
{

    $stock = Stock::where('stock_name', $stock_name)->first();
    if ($stock == null) {
        return null;
    }

    return response()->json($stock->unit_selling_price);
}

public function store(Request $request)
{
    $this->validate($request, [
        'stock_name' => 'required',
        'sale_quantity' => 'required|numeric|min:1|max:\'.$stock[\'stock_quantity\']',
        'unit_selling_price' => 'required',
        'total_sales_cost' => 'required'
    ]);

    //create stock
    $sale = new Sale;
    $sale->stock_name = $request->input('stock_name');
    $sale->sale_quantity = $request->input('sale_quantity');
    $sale->unit_selling_price = $request->input('unit_selling_price');
    $sale->total_sales_cost = $request->input('total_sales_cost');
    $sale->save();
    DB::table('stocks')->where('stock_name', $request->input('stock_name'))->decrement('stock_quantity', $request->input('sale_quantity'));

    return redirect('/sales')->with('success', 'Sale Saved');
}


public function show($sales_id)
{
    $sale = Sale::find($sales_id);
    return view('sales.show')->with('sale', $sale);
}

/**
 * Show the form for editing the specified resource.
 *
 * @param  int $sales_id
 * @return \Illuminate\Http\Response
 */
public function edit($sales_id)
{
    $sale = Sale::findOrFail($sales_id);
    $stocks = Stock::latest('stock_name', 'unit_selling_price')->get();
    return view('sales.edit', compact('sale', 'stocks'));
}

/**
 * Update the specified resource in storage.
 *
 * @param  \Illuminate\Http\Request $request
 * @param  int $sales_id
 * @return \Illuminate\Http\Response
 */
public function update(Request $request, $sales_id)
{
    $this->validate($request, [
        'stock_name' => 'required',
        'sale_quantity' => 'required|numeric|min:1|max:\'.$stock[\'stock_quantity\']',
        'unit_selling_price' => 'required',
        'total_sales_cost' => 'required'

    ]);

    //create stock
    $sale = Sale::find($sales_id);
    $sale->stock_name = $request->input('stock_name');
    $sale->sale_quantity = $request->input('sale_quantity');
    $sale->unit_selling_price = $request->input('unit_selling_price');
    $sale->total_sales_cost = $request->input('total_sales_cost');
    $sale->save();

    return redirect('/sales')->with('success', 'Sale Updated');
}

/**
 * Remove the specified resource from storage.
 *
 * @param  int $sales_id
 * @return \Illuminate\Http\Response
 */
public function destroy($sales_id)
{
    $sale = Sale::find($sales_id);
    $sale->delete();
    return redirect('/sales')->with('success', 'Sale Removed');
}
}

create.blade.php

@extends('layouts.app')

@section('content')
    <br>
    <h1>Add Sale</h1>
    {!! Form::open(['action' => 'SalesController@store', 'method' => 'POST', 'enctype' => 'multipart/form-data']) !!}

<div class="form-group">
    <label>Product Name</label>
    <select name="stock_name" id="stock_name" class="form-control">
        @foreach ($stocks as $stock)
            <option value="{{ $stock->stock_name }}">{{ $stock->stock_name}}</option>
        @endforeach
    </select>
</div>

<div class="form-group">
    {{Form::label('sale_quantity', 'Quantity')}}
    {{Form::text('sale_quantity', '', ['class' => 'form-control', 'placeholder' => 'Quantity', 'id' => 'sales_quantity'])}}
</div>

<div class="form-group">
    {{Form::label('unit_selling_price', 'Unit Selling Price')}}
    {{Form::text('unit_selling_price', '', ['class' => 'form-control', 'placeholder' => 'Unit Selling Price', 'id' => 'unit_selling_price'])}}
</div>

<div class="form-group">
    {{Form::label('total_sales_cost', 'Total Sales Cost')}}
    {{Form::text('total_sales_cost', '', ['class' => 'form-control', 'placeholder' => 'Total Sales Cost', 'id' => 'total_sales_cost', 'readonly' => 'true', 'cursor: pointer' => 'true' ])}}
</div>

{{Form::submit('Submit', ['class' => 'btn btn-primary'])}}
{!! Form::close() !!}

<script>
    $(document).ready(function () {
        $("#stock_name").on('change', function () {
            var stock_name = $(this).val();
            $.ajax({
                url: '/sales-price/getunitsellingprice/'+stock_name,
                method: 'GET',
                success: function (response) {
                    console.log(response);
                    $("#unit_selling_price").val(response);
                },
            });
        });
    });
</script>


<script>
    $(document).ready(function () {
        $("#total_sales_cost").click(function () {
            var sales_quantity = $("#sales_quantity").val();

            var unit_selling_price = $("#unit_selling_price").val();
            var total_sales_cost = (sales_quantity * unit_selling_price);

            $('#total_sales_cost').val(total_sales_cost);
        });
    });
</script>
@endsection

Ответы [ 2 ]

1 голос
/ 01 ноября 2019

SalesController.php изменяет при сохранении и обновлении функций. Это единственные изменения, лезвие было хорошо.

<?php

namespace App\Http\Controllers;

use App\Http\Requests;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use App\Sale;
use DB;
use App\Stock;

class SalesController extends Controller
{
    function __construct()
    {
        $this->middleware('permission:sales-list');
        $this->middleware('permission:sales-create', ['only' => ['create', 'store']]);
        $this->middleware('permission:sales-edit', ['only' => ['edit', 'update']]);
        $this->middleware('permission:sales-delete', ['only' => ['destroy']]);
    }
    public function index()
    {
        $sales = Sale::orderBy('updated_at', 'desc')->get();
        return view('sales.index')->with('sales', $sales);
    }

    public function create()
    {
        $stocks = Stock::all();
        //dd($stocks);
        return view('sales.create', compact('stocks'));
        //$sales = Sale::pluck('stock_id')->prepend('stock_id');
        //$sales = DB::table('stocks')->select('stock_id')->get();
        //return view('sales.create')->with('sales',$sales);
    }

    public function getUnitSellingPrice(Request $request, $stock_name)
    {
        $stock = Stock::where('stock_name', $stock_name)->first();
        if ($stock == null) {
            return null;
        }
        return response()->json($stock->unit_selling_price);
    }

    public function getStockUnitCost(Request $request, $stock_name)
    {
        $stock = Stock::where('stock_name', $stock_name)->first();
        if ($stock == null) {
            return null;
        }
        return response()->json($stock->stock_unit_cost);
    }

    public function salesWebReport(){
        $sales = Sale::orderBy('updated_at', 'desc')->get();
        return view('sales.saleswebreport')->with('sales', $sales);
    }

    public function photocopying(){
        $stocks = Stock::all();
        //dd($stocks);
        return view('sales.photocopy', compact('stocks'));
    }

    public function store(Request $request)
    {
        //get retrieves an array
        //$stock = \App\Stock::where('stock_name', $request->input('stock_name'))->get();

        //first retrieves an array BUT removes everything and produces only the required field value
        $stock = Stock::where('stock_name', $request->input('stock_name'))->firstOrFail();
        $qty = $stock->stock_quantity;

        $this->validate($request, [
            'stock_name' => 'required',
            'sale_quantity' => 'required|numeric|min:1|max:'.$qty,
            'unit_selling_price' => 'required',
            'total_sales_cost' => 'required',
            'stock_profit' => 'required'
        ]);
        //create stock
        $sale = new Sale;
        $sale->stock_name = $request->input('stock_name');
        $sale->sale_quantity = $request->input('sale_quantity');
        $sale->unit_selling_price = $request->input('unit_selling_price');
        $sale->total_sales_cost = $request->input('total_sales_cost');
    $sale->stock_profit = $request->input('stock_profit');
    $sale->save();
    DB::table('stocks')->where('stock_name', $request->input('stock_name'))->decrement('stock_quantity', $request->input('sale_quantity'));

    return redirect('/sales')->with('success', 'Sale Saved');
}

public function show($sales_id)
{
    $sale = Sale::find($sales_id);
    return view('sales.show')->with('sale', $sale);
}

public function edit($sales_id)
{
    $sale = Sale::findOrFail($sales_id);
    $stocks = Stock::latest('stock_name', 'unit_selling_price')->get();
    return view('sales.edit', compact('sale', 'stocks'));
}
public function update(Request $request, $sales_id)
{
    //get retrieves an array
    //$stock = \App\Stock::where('stock_name', $request->input('stock_name'))->get();

    //first retrieves an array BUT removes everything and produces only the required field value
    $stock = Stock::where('stock_name', $request->input('stock_name'))->firstOrFail();
    $qty = $stock->stock_quantity;

    $this->validate($request, [
        'stock_name' => 'required',
        'sale_quantity' => 'required|numeric|min:1|max:'.$qty,
        'unit_selling_price' => 'required',
        'total_sales_cost' => 'required',
        'stock_profit' => 'required'
    ]);
    //create stock
    $sale = Sale::find($sales_id);
    $sale->stock_name = $request->input('stock_name');
    $sale->sale_quantity = $request->input('sale_quantity');
    $sale->unit_selling_price = $request->input('unit_selling_price');
    $sale->total_sales_cost = $request->input('total_sales_cost');
    $sale->stock_profit = $request->input('stock_profit');
    $sale->save();

    return redirect('/sales')->with('success', 'Sale Updated');
}

public function destroy($sales_id)
{
    $sale = Sale::find($sales_id);
    $sale->delete();
    return redirect('/sales')->with('success', 'Sale Removed');
}
}
0 голосов
/ 05 октября 2019

В соответствии с показанной ошибкой, возможно, что ваша переменная и данные массива воспринимаются как строковая строка в этой строке:

'sale_quantity' => 'required|numeric|min:1|max:\'.$stock[\'stock_quantity\']',

Попробуйте с двойными кавычками php:

'sale_quantity' => "required|numeric|min:1|max:$stock['stock_quantity']",

Или, чтобы интерпретатору было еще проще, перед этапом проверки назначьте простую переменную:

 $qty = $stock['stock_quantity'];

, а затем в валидаторе:

'sale_quantity' => "required|numeric|min:1|max:$qty",

YouВозможно, стоит рассмотреть возможность использования какого-либо типа проверки на стороне клиента, чтобы сделать это еще сильнее, а также чтобы помочь пользователям. Возможно, передайте это значение $qty из ваших методов редактирования / создания на вашем контроллере на блейд-страницу, а затем используйте что-то вроде Проверка JQuery , чтобы проверить форму, прежде чем пользователь даже отправит ее на сервер.

Итак - чтобы решить это, примерно так:

public function store(Request $request)
{
  $stock = \App\Stock::find($someIdOfYourChoiceOrFromTheForm)
  $qty = $stock->stock_quantity;

  $this->validate($request, [
    'stock_name' => 'required',
    'sale_quantity' => "required|numeric|min:1|max:$qty",
    'unit_selling_price' => 'required',
    'total_sales_cost' => 'required'
   ]);
...