joshua_bognet's avatar

"trying to access array offset on value of type null ['subtotal']".

Hello Guys i've been following this Laravel/livewire E-Commerce series and i ecountered this frustrating error. Everything seems to be oky with the code but each time i click on the place order button from my checkout page, it raises a "trying to access array offset on value of type null ['subtotal']". i really dont know what to do. i am kinda a newbie. will really appreciate if someone helps me out. thanks.

this is how my checkout compopnent looks like

0 likes
18 replies
Sinnbeck's avatar

Please show some code. It's impossible to guess the error without it

Salman98's avatar

@joshua_bognet Hello sir.. I have the same problem. If you solved this problem please kindly tell me what I want to do. this is my email [email protected]

or if anyone can solve this problem please help me

Sinnbeck's avatar

To add code you add ``` on the line before and after your code

joshua_bognet's avatar
<?php

namespace App\Http\Livewire;

use Cart;
use App\Models\Order;
use Livewire\Component;
use App\Models\Shipping;
use App\Models\OrderItem;
use App\Models\Transaction;
use Illuminate\Support\Facades\Auth;


class CheckoutComponent extends Component
{
    public $ship_to_different;

    public $firstname;
    public $lastname;
    public $email;
    public $mobile;
    public $line1;
    public $line2;
    public $city;
    public $state;
    public $country;
    public $zipcode;

    public $s_firstname;
    public $s_lastname;
    public $s_email;
    public $s_mobile;
    public $s_line1;
    public $s_line2;
    public $s_city;
    public $s_state;
    public $s_country;
    public $s_zipcode;
    
    public $paymentmode;
    public $thankyou;

    public function updated($fields)
    {
        $this->validateOnly($fields, [

            'firstname' => 'required',
            'lastname' => 'required',
            'email' => 'required|email',
            'mobile' => 'required|numeric',
            'line1' => 'required',
            'city' => 'required',
            'state' => 'required',
            'country' => 'required',
            'zipcode' => 'required',
            'paymentmode' => 'required'
        ]);

        if ($this->ship_to_different) 
        {
            $this->validateOnly($fields, [
                's_firstname' => 'required',
                's_lastname' => 'required',
                's_email' => 'required|email',
                's_mobile' => 'required|numeric',
                's_line1' => 'required',
                's_city' => 'required',
                's_state' => 'required',
                's_country' => 'required',
                's_zipcode' => 'required'
            ]);
        }
    }


    public function placeOrder()
    {
        $this->validate([

            'firstname' => 'required',
            'lastname' => 'required',
            'email' => 'required|email',
            'mobile' => 'required|numeric',
            'line1' => 'required',
            'city' => 'required',
            'state' => 'required',
            'country' => 'required',
            'zipcode' => 'required',
            'paymentmode' => 'required'
        ]);

        $order = new Order();
        $order->user_id = Auth::user()->id;
        $order->subtotal = session()->get('checkout')['subtotal'];
        $order->discount = session()->get('checkout')['discount'];
        $order->tax = session()->get('checkout')['tax'];
        $order->total = session()->get('checkout')['total'];
        $order->firstname = $this->firstname;
        $order->lastname = $this->lastname;
        $order->email = $this->email;
        $order->mobile = $this->mobile;
        $order->line1 = $this->line1;
        $order->line2 = $this->line2;
        $order->city = $this->city;
        $order->state = $this->state;
        $order->country = $this->country;
        $order->zipcode = $this->zipcode;
        $order->status = 'ordered';
        $order->is_shipping_different = $this->ship_to_different ? 1:0;
        $order->save();

        foreach (Cart::instance('cart')->content() as $item) {
            $orderItem = new OrderItem();
            $orderItem->product_id = $item->id;
            $orderItem->order_id = $order->id;
            $orderItem->price = $item->price;
            $orderItem->quantity = $item->qty;
            $orderItem->save();
        }
        if ($this->ship_to_different) {
            $this->validate([
                's_firstname' => 'required',
                's_lastname' => 'required',
                's_email' => 'required|email',
                's_mobile' => 'required|numeric',
                's_line1' => 'required',
                's_city' => 'required',
                's_state' => 'required',
                's_country' => 'required',
                's_zipcode' => 'required'
            ]);

            $shipping = new Shipping();
            $shipping->order_id = $order->id;
            $shipping->firstname = $this->s_firstname;
            $shipping->lastname = $this->s_lastname;
            $shipping->email = $this->s_email;
            $shipping->mobile = $this->s_mobile;
            $shipping->line1 = $this->s_line1;
            $shipping->line2 = $this->s_line2;
            $shipping->city = $this->s_city;
            $shipping->state = $this->s_state;
            $shipping->country = $this->s_country;
            $shipping->zipcode = $this->s_zipcode;
            $shipping->save();
        }

        if ($this->paymentmode == 'cod') {
            $transaction = new Transaction();
            $transaction->user_id = Auth::user()->id;
            $transaction->order_id = $order->id;
            $transaction->mode = 'cod';
            $transaction->status = 'pending';
            $transaction->save();
        }


        $this->thankyou = 1;
        Cart::instance('cart')->destroy();
        session()->forget('checkout');
    }




    public function verifyForCheckout()
    {
        if(!Auth::check()) 
        {
            return redirect()->route('login');
        }
         else if($this->thankyou) 
        {
            return redirect()->route('thankyou');
        } 
        else if(!session()->get('checkout')) 
        {
            return redirect()->route('product.cart');
        }
    }



    public function render()
    {  
        // $this->verifyForCheckout();
        return view('livewire.checkout-component')->layout('layouts.master');
    }
}
joshua_bognet's avatar

the checkout component blade

<main id="main" class="main-site">
    <div class="container">
        <div class=" main-content-area">
            <form  wire:submit.prevent="placeOrder">
                <div class="row">
                    <div class="col-md-12">
                        <div class="wrap-address-billing">
                            <h3 class="box-title">Billing Address</h3>
                            <div class="billing-address">
                                <p class="row-in-form">
                                    <label for="fname">first name<span>*</span></label>
                                    <input type="text" name="fname" value="" placeholder="Your name"
                                        wire:model="firstname">
                                    @error('firstname')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>
                                <p class="row-in-form">
                                    <label for="lname">last name<span>*</span></label>
                                    <input type="text" name="lname" value=""
                                        placeholder="Your last name"wire:model="lastname">
                                    @error('lastname')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>
                                <p class="row-in-form">
                                    <label for="email">Email Addreess:</label>
                                    <input type="email" name="email" value=""
                                        placeholder="Type your email" wire:model="email">
                                    @error('email')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>
                                <p class="row-in-form">
                                    <label for="phone">Phone number<span>*</span></label>
                                    <input type="number" name="phone" value=""
                                        placeholder="10 digits format" wire:model="mobile">
                                    @error('mobile')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>
                                <p class="row-in-form">
                                    <label for="add">Line 1:</label>
                                    <input type="text" name="add" value=""
                                        placeholder="Street at apartment number" wire:model="line1">
                                    @error('line1')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>
                                <p class="row-in-form">
                                    <label for="add">Line 2:</label>
                                    <input type="text" name="add" value=""
                                        placeholder="Street at apartment number" wire:model="line2">
                                </p>
                                <p class="row-in-form">
                                    <label for="country">Country<span>*</span></label>
                                    <input type="text" name="country" value=""
                                        placeholder="United States" wire:model="country">
                                    @error('country')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>


                                <p class="row-in-form">
                                    <label for="city">State<span>*</span></label>
                                    <input type="text" name="state" value="" placeholder="State name"
                                        wire:model="state">
                                    @error('state')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>
                                <p class="row-in-form">
                                    <label for="city">Town / City<span>*</span></label>
                                    <input type="text" name="city" value="" placeholder="City name"
                                        wire:model="city">
                                    @error('city')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>
                                <p class="row-in-form">
                                    <label for="zip-code">Postcode / ZIP:</label>
                                    <input type="number" name="zip-code" value=""
                                        placeholder="Your postal code" wire:model="zipcode">
                                    @error('zipcode')
                                        <span class="text-danger">{{ $message }}</span>
                                    @enderror
                                </p>
                                <p class="row-in-form fill-wife">
                                    <label class="checkbox-field">
                                        <input name="different-add" id="different-add" value="1"
                                            type="checkbox" wire:model="ship_to_different">
                                        <span>Ship to a different address?</span>
                                    </label>
                                </p>
                            </div>
                        </div>
                    </div>
                    
                    @if($ship_to_different)
                        <div class="col-md-12">
                            <div class="wrap-address-billing">
                                <h3 class="box-title">Shipping Address</h3>
                                <div class="billing-address">
                                    <p class="row-in-form">
                                        <label for="fname">first name<span>*</span></label>
                                        <input type="text" name="fname" value=""
                                            placeholder="Your name" wire:model="s_firstname">
                                        @error('s_firstname')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>
                                    <p class="row-in-form">
                                        <label for="lname">last name<span>*</span></label>
                                        <input type="text" name="lname" value=""
                                            placeholder="Your last name"wire:model="s_lastname">
                                        @error('s_lastname')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>
                                    <p class="row-in-form">
                                        <label for="email">Email Addreess:</label>
                                        <input type="email" name="email" value=""
                                            placeholder="Type your email" wire:model="s_email">
                                        @error('s_email')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>
                                    <p class="row-in-form">
                                        <label for="phone">Phone number<span>*</span></label>
                                        <input type="number" name="phone" value=""
                                            placeholder="10 digits format" wire:model="s_mobile">
                                        @error('s_mobile')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>
                                    <p class="row-in-form">
                                        <label for="add">Line 1:</label>
                                        <input type="text" name="add" value=""
                                            placeholder="Street at apartment number" wire:model="s_line1">
                                        @error('s_line1')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>
                                    <p class="row-in-form">
                                        <label for="add">Line 2:</label>
                                        <input type="text" name="add" value=""
                                            placeholder="Street at apartment number" wire:model="s_line2">
                                    </p>
                                    <p class="row-in-form">
                                        <label for="country">Country<span>*</span></label>
                                        <input type="text" name="country" value=""
                                            placeholder="United States" wire:model="s_country">
                                        @error('s_country')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>

                                    <p class="row-in-form">
                                        <label for="city">State<span>*</span></label>
                                        <input type="text" name="state" value=""
                                            placeholder="State name" wire:model="s_state">
                                        @error('s_state')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>
                                    <p class="row-in-form">
                                        <label for="city">Town / City<span>*</span></label>
                                        <input type="text" name="city" value=""
                                            placeholder="City name" wire:model="s_city">
                                        @error('s_city')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>
                                    <p class="row-in-form">
                                        <label for="zip-code">Postcode / ZIP:</label>
                                        <input type="number" name="zip-code" value=""
                                            placeholder="Your postal code" wire:model="s_zipcode">
                                        @error('s_zipcode')
                                            <span class="text-danger">{{ $message }}</span>
                                        @enderror
                                    </p>
                                </div>
                            </div>
                        </div>
                    @endif
                </div>

                <div class="summary summary-checkout">
                    <div class="summary-item payment-method">
                        <h4 class="title-box">Payment Method</h4>
                        <p class="summary-info"><span class="title">Check / Money order</span></p>
                        <p class="summary-info"><span class="title">Credit Cart (saved)</span></p>
                        <div class="choose-payment-methods">
                            <label class="payment-method">
                                <input name="payment-method" id="payment-method-bank" value="cod"
                                    type="radio" wire:model="paymentmode">
                                <span>Cash On Delivery</span>
                                <span class="payment-desc">Order Now And Pay On Delivery</span>
                            </label>
                            <label class="payment-method">
                                <input name="payment-method" id="payment-method-visa" value="card"
                                    type="radio" wire:model="paymentmode">
                                <span>Debit/Credit Card</span>
                                <span class="payment-desc">There are many variations of passages of Lorem Ipsum
                                    available</span>
                            </label>
                            <label class="payment-method">
                                <input name="payment-method" id="payment-method-paypal" value="paypal"
                                    type="radio" wire:model="paymentmode">
                                <span>Paypal</span>
                                <span class="payment-desc">You can pay with your credit</span>
                                <span class="payment-desc">card if you don't have a paypal account</span>
                            </label>
                            @error('paymentmode')
                                <span class="text-danger">{{ $message }}</span>
                            @enderror
                        </div>
                        
                        @if(Session::has('checkout'))
                            <p class="summary-info grand-total"><span>Grand Total</span> <span
                                    class="grand-total-price">&#8358;{{ Session::get('checkout')['total'] }}</span>
                            </p>
                        @endif
                        
                        <button type="submit" class="btn btn-medium" >Place order now</button>
                    </div>
                    <div class="summary-item shipping-method">
                        <h4 class="title-box f-title">Shipping method</h4>
                        <p class="summary-info"><span class="title">Flat Rate</span></p>
                        <p class="summary-info"><span class="title">Fixed &#8358;0</span></p>
                    </div>
                </div>
            </form>
        </div>
    </div>
</main> 
    
Sinnbeck's avatar

@joshua_bognet This line

$order->subtotal = session()->get('checkout')['subtotal'];

If session()->get('checkout') does not return an array with that key it all fails. So add a fallback

$order->subtotal = session()->get('checkout')['subtotal'] ?? 100000000000000000000000000000;
1 like
Salman98's avatar

@Sinnbeck Sir, I add a fallback to my code and after that it didn't show any error. but I noticed that when I make a new order, The total and subtotal didn't update in database.

this is the code,

$order = new Order(); $order->user_id = Auth::user()->id; $order->subtotal = session()->get('checkout')['subtotal']?? 100000000000000000000000000000; $order->total = session()->get('checkout')['total']?? 100000000000000000000000000000; $order->firstname = $this->firstname; $order->lastname = $this->lastname; $order->email = $this->email; $order->mobile = $this->mobile; $order->line1 = $this->line1; $order->line2 = $this->line2; $order->city = $this->city; $order->province = $this->province; $order->country = $this->country; $order->zipcode = $this->zipcode; $order->status = 'ordered'; $order->is_shipping_different = $this->ship_to_different ? 1:0; $order->save();

other fields (firstname,lastname,mobile, ...) are updated without any error. Please can you give any solution?

joshua_bognet's avatar
$order = new Order();
        if(session()->has('coupon')) 
        {
            $order->user_id = Auth::user()->id;
            $order->subtotal = session()->get('checkout')['subtotal'];
            $order->discount = session()->get('checkout')['discount'] ?? True;
            $order->tax  = session()->get('checkout')['tax'] ?? True;
            $order->total = session()->get('checkout')['total'] ?? True;
            $order->firstname = $this->firstname;
            $order->lastname = $this->lastname;
            $order->email = $this->email;
            $order->mobile = $this->mobile;
            $order->line1 = $this->line1;
            $order->line2 = $this->line2;
            $order->city = $this->city;
            $order->state = $this->state;
            $order->country = $this->country;
            $order->zipcode = $this->zipcode;
            $order->status = 'ordered';
            $order->is_shipping_different = $this->ship_to_different ? 1 : 0;
            $order->save();

        } 
        else
        {
            $order->user_id = Auth::user()->id;

            $order->subtotal = session()->get('checkout', Cart::instance('cart')->subtotal());
            $order->discount = session()->get('checkout')['discount'] ?? True;
            $order->tax = session()->get('checkout', Cart::instance('cart')->tax());
            $order->total = session()->get('checkout', Cart::instance('cart')->total());
            $order->firstname = $this->firstname;
            $order->lastname = $this->lastname;
            $order->email = $this->email;
            $order->mobile = $this->mobile;
            $order->line1 = $this->line1;
            $order->line2 = $this->line2;
            $order->city = $this->city;
            $order->state = $this->state;
            $order->country = $this->country;
            $order->zipcode = $this->zipcode;
            $order->status = 'ordered';
            $order->is_shipping_different = $this->ship_to_different ? 1 : 0;
            $order->save();

        }

Please or to participate in this conversation.