Обновить поле из другой модели после сохранения данных в другую таблицу в Laravel

#php #laravel #if-statement #conditional-statements

#php #laravel #if-оператор #условные операторы

Вопрос:

Я хотел бы попросить вашей помощи. Я не являюсь опытным программистом, поэтому я не могу создать правильный код для этого.

У меня есть приложение для оплаты заказов, которое сохраняет оплату за определенные заказы. Там нет проблем. данные сохраняются в таблице ORDER_PAYMENTs.

в моей функции create у меня есть это

 public function create($order_id)
{

    $order = Orders::find($order_id);
    $order->company;
    $order->currency;
    $banks = Banks::all('name','acronym','id')->pluck('name','id')->all();
    $balance = Orderpayments::where('order_id', '=', $order_id)->sum('amount');
    // dd($balance);
    return view('orderPayments.create', compact('balance'))
               ->with('banks', $banks)
               ->with('order', $order);
}
  

переменная $balance выполняет вычисление общей суммы, затем я выполню фактическое вычисление в create.blade , чтобы проверить, есть ли еще сумма баланса. вот как это выглядит

     <div class="form-group">
        <span><strong>Remaining Balance</strong></span>
        <p class="text-danger">@php $remainingBalance = $order->grandtotal-$balance; @endphp
        {{ number_format($remainingBalance, 2) }}</p>                           
</div>  
  

Теперь, что я хочу сделать, это поставить условие при СОХРАНЕНИИ данных (я имею в виду функцию СОХРАНЕНИЯ), что если платеж покрывает весь оставшийся баланс, он должен обновить столбец «ОПЛАЧЕНО» в таблице «ЗАКАЗЫ«. Вот текущий вид моей функции хранения.

 public function store(Request $request)
    {
        $this->validate($request, [
            'order_id'      => '',
            'company_id'    => '',
            'currency_id'   => '',
            'bank'          => '',
            'type'          => '',
            'payment_date'  => '',
            'amount'        => 'min:1',
            'rate'          => '',
            'bank'          => '',
            'page'          => '',
            'number'        => '',
            'booklet_number'=> '',
            'voucher_num'   => '',
            'notes'         => '',
            'user_id'       => ''
        ]);
        $orderpayments = Orderpayments::create($request->only(
            'order_id',
            'company_id',
            'currency_id',
            'bank',
            'type',
            'payment_date',
            'amount',
            'rate',
            'bank',
            'page',
            'number',
            'booklet_number',
            'voucher_num',
            'notes',
            'user_id'
        ));

        // NO IDEA ON HOW TO MAKE THE CONDITION PROPERLY
        // $balance = Orderpayments::where('order_id', '=', $order_id)->sum('amount');
        $order = Orders::all();
        // $paidOrder = $order->paid;

        dd($balance);
        // if ($balance < 1) {
        //     $amount = ;
        //     $item->save();
        // }

        if ($request){
            Session::flash('message','Purchase order was successfully added');
            Session::flash('m-class','alert-success');
        } else {
            Session::flash('message','Data is not saved');
            Session::flash('m-class','alert-danger');
            return redirect()->route('orders.index');
        }
        return redirect()->route('orders.index');
    }
  

Сначала я подумываю получить переменную $ balance из функции CREATE, поскольку в ней уже есть вычисления, затем оттуда я проверю, $balance ниже 1, а затем, если это так, обновлю столбец ОПЛАЧЕНО из таблицы заказов до ‘1’

Я не опытный программист, я продвинулся так далеко только из-за руководств отовсюду и задавал вопросы здесь. Я не могу найти подходящее руководство, чтобы охватить мою проблему. можете ли вы помочь мне построить логику, которой я хочу достичь?

Заранее большое спасибо, ребята!!!

ОБНОВЛЕНИЕ ХОДА ВЫПОЛНЕНИЯ

Теперь у меня есть это

     // HERE'S THE PART THAT THE CONDITION IS PLACE
    //get the total amount paid
    $totalPaidAmount = Orderpayments::where('order_id', '=', $orderpayments->order_id)->sum('amount');
    //get the total order cost
    $orderGrandTotal = Orders::where('id', '=', $orderpayments->order_id)->get();
    //Set variable for grand total attribute Orders table
    $grandtotal = $orderGrandTotal->first()->grandtotal;
    //set variable for paid attribute in Orders table
     $paid = $orderGrandTotal->first()->paid;
    //Get the difference between  total order cost and total amount paid
    $totalBalance = $grandtotal - $totalPaidAmount;

    // dd($totalBalance);
    if ($totalBalance == 0) {
        $paid = 1;
        $paid->save();    
    }
  

Моя новая проблема заключается в том, что когда баланс достигает 0, условие, которое я поставил, должно сохранить $ paid = 1, верно? вместо этого у меня возникает эта ошибка

введите описание изображения здесь

в настоящее время это моя проблема. часть сохранения и условие.

Я надеюсь, что вы могли бы мне помочь, ребята. заранее спасибо!!!

РЕШАЕМАЯ

ребята, на всякий случай, если вы попадаете в ловушку для себя в такой ситуации, вот что я сделал.

     // HERE'S THE PART THAT THE CONDITION IS PLACE
    //get the total amount paid
    $totalPaidAmount = Orderpayments::where('order_id', '=', $orderpayments->order_id)->sum('amount');
    //get the total order cost
    $orderGrandTotal = Orders::where('id', '=', $orderpayments->order_id)->get();
    //Set variable for grand total attribute Orders table
    $grandtotal = $orderGrandTotal->first()->grandtotal;

    //Get the difference between  total order cost and total amount paid
    $totalBalance = $grandtotal - $totalPaidAmount;

    if ($totalBalance < 1) {
        $setToPaid = AppOrders::where('id', '=', $orderpayments->order_id)->first();
        $setToPaid->paid = 1;
        $setToPaid->save();
    }

    if ($request){
        Session::flash('message','Purchase order was successfully added');
        Session::flash('m-class','alert-success');
    } else {
        Session::flash('message','Data is not saved');
        Session::flash('m-class','alert-danger');
        return redirect()->route('orders.index');
    }
    return redirect()->route('orders.index');
  

Узнайте больше здесь Спасибо @Marco за совет!

Комментарии:

1. Вы присваиваете целое число $ paid и прямо ниже пытаетесь вызвать для него метод! Понял? То, что находится в $paid, больше не является объектом, который вы можете вызвать методом. Вам нужно сделать что-то подобное для создания, но на самом деле обновление для обновления оплачивается до 1.

2. привет @Marco, ты можешь показать мне, как?

3. Вы используете Eloquent как ORM или что?

4. Я использую Eloquent

Ответ №1:

Из документов

  // HERE'S THE PART THAT THE CONDITION IS PLACE
//get the total amount paid
$totalPaidAmount = Orderpayments::where('order_id', '=', $orderpayments->order_id)->sum('amount');
//get the total order cost
//$orderGrandTotal = Orders::where('id', '=', $orderpayments->order_id)->get();
$orderGrandTotal = Orders::find($orderpayments->order_id);
//Set variable for grand total attribute Orders table
$grandtotal = $orderGrandTotal->grandtotal;
//set variable for paid attribute in Orders table
 $paid = $orderGrandTotal->paid;
//Get the difference between  total order cost and total amount paid
$totalBalance = $grandtotal - $totalPaidAmount;

// dd($totalBalance);
if ($totalBalance == 0) {
    $orderGrandTotal->paid = 1;
    $orderGrandTotal->save();    
}
  

Я не тестировал, но это то направление, в котором вы хотите двигаться.

Комментарии:

1. Привет @Marco, там написано «Метод save не существует».

2. Выполните dd() в $ orderGrandTotal, у него должен быть объект o, представляющий строку из базы данных. Попробуйте прочитать ссылку на документацию, которую я также предоставил. Мы здесь, чтобы указать вам правильное направление, а не кодировать для вас.

3. Спасибо за совет

4. Я не хотел быть резким, хорошо? Я здесь, чтобы помочь, но вы должны попробовать некоторые вещи и сообщить нам, какие результаты у вас есть. 🙂

5. да @Marco не беспокойтесь 🙂 Еще раз спасибо