Do I have to return header data from database in every controller in laravel?

Viewed 324

I'm new to Laravel coming from PHP core I'm trying to load data from the database in my header.blade.php which is included in app.blade.php.

Do I have to return the header data variable in every view? Do I have to write the same code in every controller function which is returning a view?

If there is another way to achieve that please let me know.

Currently, I have loaded data to my dashboard but it is only available to the dashboard. Please help me out.

class DashboardController extends Controller
{
    function index()
    {   
        
          $users = User::with('companies')
          ->where('id' , auth()->user()->id)
          ->get();

        return view('dashboard')
        ->with('users',$users);
    }
}

here is header.blade.php

<nav class="navbar navbar-expand-md navbar-dark bg-dark shadow-sm clear-fix">
<div class="container-fluid">
    @guest
        <a class="navbar-brand" href="{{ url('/') }}">
            {{ config('app.name', '') }}
        </a>
    @endguest

    <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent"
        aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="{{ __('Toggle navigation') }}">
        <span class="navbar-toggler-icon"></span>
    </button>

    <div class="collapse navbar-collapse" id="navbarSupportedContent">
        <!-- Left Side Of Navbar -->
        @auth
            <ul class="navbar-nav mr-auto">
                <li class="nav-item active">
                    <div class="dropdown open">
                        <button class="btn btn-secondary dropdown-toggle" type="button" id="triggerId"
                            data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
                           Companies
                        </button>
                        <div class="dropdown-menu" aria-labelledby="triggerId">
                            @foreach ($users as $user)
                                @foreach ($user->copmanies as $company)
                                    <a class="dropdown-item" href="#">{{ $company->name }}</a>
                                @endforeach
                            @endforeach
                        </div>
                    </div>
                </li>
                <li class="nav-item active">
                    <a class="nav-link" href="{{ route('dashboard') }}">Dashboard <span
                            class="sr-only">(current)</span></a>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        Business
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">Short-term cash-flow</a>
                        <a class="dropdown-item" href="#">Business snapshot</a>
                        <hr>
                        <a class="dropdown-item" href="{{ route('invoices.view', '1') }}">Invoices</a>
                        <a class="dropdown-item" href="{{ route('quotes.view', '1') }}">Quotes</a>
                        <a class="dropdown-item" href="{{ route('sales_overview', '1') }}">Sales Overview</a>
                        <hr>
                        <a class="dropdown-item" href="{{ route('bills.view', '1') }}">Bills</a>
                        <a class="dropdown-item" href="{{ route('purchaseorders.view', '1') }}">Purchase Orders</a>
                        <a class="dropdown-item" href="{{ route('purchases_overview', '1') }}">Purchase Overview</a>
                        <hr>
                        <a class="dropdown-item" href="#">Expense claim</a>
                        <a class="dropdown-item" href="#">Products and srevices</a>
                        <a class="dropdown-item" href="#">Pay run</a>
                        <a class="dropdown-item" href="#">Cheques</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        Accouting
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">Bank Account</a>
                        <a class="dropdown-item" href="#">Reports</a>
                        <a class="dropdown-item" href="#">Advance</a>
                        <hr>
                        <p><i class="fas fa-star"></i> Reports</p>
                        <a class="dropdown-item" href="#">Accounts Transactions</a>
                        <a class="dropdown-item" href="#">Aged Payable Summary</a>
                        <a class="dropdown-item" href="#">Aged Reciveable Summary</a>
                        <a class="dropdown-item" href="#">Balance Sheet</a>
                        <a class="dropdown-item" href="#">Profit And Loss</a>
                        <a class="dropdown-item" href="#">Sales Tax Report</a>
                        <hr>
                        <p><i class="fas fa-star"></i> Advance</p>
                        <a class="dropdown-item" href="#">Chart of accounts</a>
                        <a class="dropdown-item" href="#">Find and record</a>
                        <a class="dropdown-item" href="#">Fixed assets</a>
                        <a class="dropdown-item" href="#">Manual journals</a>

                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        Projects
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">All Projects</a>
                        <a class="dropdown-item" href="#">Time entries</a>
                        <a class="dropdown-item" href="#">Staff Time Overview</a>
                        <a class="dropdown-item" href="#">Staff Cost Rate</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        Contacts
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">All Contacts</a>
                        <a class="dropdown-item" href="#">Customers</a>
                        <a class="dropdown-item" href="#">Suppliers</a>
                        <a class="dropdown-item" href="#">Employees</a>
                        <hr>
                        <a class="dropdown-item" href="#">Traning Customers</a>
                    </div>
                </li>
            </ul>
        @endauth


        <!-- Right Side Of Navbar -->
        <ul class="navbar-nav ml-auto">
            <!-- Authentication Links -->
            @guest
                @if (Route::has('login'))
                    <li class="nav-item">
                        <a class="nav-link" href="{{ route('login') }}">{{ __('Login') }}</a>
                    </li>
                @endif

                @if (Route::has('register'))
                    <li class="nav-item">
                        <a class="nav-link" href="{{ route('register') }}">{{ __('Register') }}</a>
                    </li>
                @endif
            @else
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        <i class="fas fa-plus"></i>
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="{{ route('invoices.new', '1') }}">Invoice</a>
                        <a class="dropdown-item" href="{{ route('invoices.new_repeating', '1') }}">Repeating
                            Invoice</a>
                        <a class="dropdown-item" href="{{ route('quotes.new', '1') }}">Qoute</a>
                        <a class="dropdown-item" href="{{ route('creditnotes.new', '1') }}">Credit Note</a>
                        <a class="dropdown-item" href="{{ route('bills.new', '1') }}">Bill</a>
                        <a class="dropdown-item" href="{{ route('purchaseorders.new', '1') }}">Purchase Order</a>
                        <a class="dropdown-item" href="#">Expense</a>
                        <a class="dropdown-item" href="#">Manual Journal</a>
                        <a class="dropdown-item" href="#">Spend Money</a>
                        <a class="dropdown-item" href="#">Recive Money</a>
                        <a class="dropdown-item" href="#">Transfer Money</a>
                        <a class="dropdown-item" href="#">Contact</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        <i class="fa fa-search" aria-hidden="true"></i>
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">Action</a>
                        <a class="dropdown-item" href="#">Another action</a>
                        <a class="dropdown-item" href="#">Something else here</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a class="nav-link dropdown-toggle" href="#" id="navbarDropdownMenuLink" data-toggle="dropdown"
                        aria-haspopup="true" aria-expanded="false">
                        <i class="fa fa-bell" aria-hidden="true"></i>
                    </a>
                    <div class="dropdown-menu" aria-labelledby="navbarDropdownMenuLink">
                        <a class="dropdown-item" href="#">Action</a>
                        <a class="dropdown-item" href="#">Another action</a>
                        <a class="dropdown-item" href="#">Something else here</a>
                    </div>
                </li>
                <li class="nav-item dropdown">
                    <a id="navbarDropdown" class="nav-link dropdown-toggle" href="#" role="button"
                        data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" v-pre>
                        {{ Auth::user()->name }}
                    </a>

                    <div class="dropdown-menu dropdown-menu-right" aria-labelledby="navbarDropdown">
                        <a class="dropdown-item" href="{{ route('logout') }}" onclick="event.preventDefault();
                                                             document.getElementById('logout-form').submit();">
                            {{ __('Logout') }}
                        </a>

                        <form id="logout-form" action="{{ route('logout') }}" method="POST" class="d-none">
                            @csrf
                        </form>
                    </div>
                </li>
            @endguest
        </ul>
    </div>
</div>
2 Answers

I often just inline this stuff for small projects.

Your query is a bit off as well. You are getting all Users but only with a certain ID. This can be rewritten as:

User::find($id)

or in your case

User::with('companies')->find($id)

Also, you can just use the \Auth::user(). I'm an old dog but I imagine auth()->user() works exactly the same.

So I would inline all of that in your header:

<div class="dropdown-menu" aria-labelledby="triggerId">
    @foreach (\Auth::user()->companies as $company)
        <a class="dropdown-item" href="#">{{ $company->name }}</a>
    @endforeach
</div>

If you need to really use this a lot or it gets more complex, you can Google View composers

https://laravel.com/docs/8.x/views#view-composers

If you also always need the companies whenever you load a user, you can eager load by default using the protected $with variable:

https://laravel.com/docs/8.x/eloquent-relationships#eager-loading-by-default

Personally I opt to use view composers:

View::composer('header', function ($view) {
     $users = User::with('companies')
          ->where('id' , auth()->user()->id)->get();
    $view->with('users',$users);
    
});

This will ensure this view always gets the data it needs when it's composed.

Related