0

I want to join two tables in my Laravel project but any same field name in two tables i use.

User table:

  • id
  • name
  • gender

Gender table:

  • id
  • name

So i create join function in Controller like this:

$account = DB::table('users')
                            ->join('genders','genders.id', '=','users.gender')
                            ->select('users.*','genders.*','users.id as users_id','users.name as users_name','genders.id as genders_id','genders.name as genders_name')
                            ->where('users.id',$id)->get()->first();

And in my blade i use this to get field name in users table:

{{ $account->users_name }}

But i got an error notification like this:

Trying to get property 'users_name' of non-object

Anyone can help me how should i do? thanks.

Marcin Nabiałek
  • 109,655
  • 42
  • 258
  • 291

4 Answers4

0

Use name instead of user_name

Try to debug the code using print_r() there are two different array will be there who have same fields so if you want to use user name then your code should be like this

{{ $account->name }}

if you want gender name then name should be inside the gender array so u can use gender name like below in blade file

{{ $account->genders['name'] }}

Edit above code

$account = DB::table('users')
                            ->join('genders','genders.id', '=','users.gender')
                            ->select('users.*','genders.*','users.id as users_id','users.name as users_name','genders.id as genders_id','genders.name as genders_name')
                            ->where('users.id',$id)->first();
Dhruv
  • 1,960
  • 1
  • 6
  • 6
0

It seems such record was not found in database - that's why you are getting this error because $account is null.

Make sure that query generates valid result and in view add condition before displaying account like this:

@if ($account)
   // here display account
@endif

or in your controller change

->first()

into

->firstOrFail()

in case you don't want further action when account was not found.

And in fact instead of:

->where('users.id',$id)->get()->first()

you can just use:

->where('users.id',$id)->first();
Marcin Nabiałek
  • 109,655
  • 42
  • 258
  • 291
0

I think maybe your user don't have genders record,

try to use left join:

$account = DB::table('users')
                            ->leftjoin('genders','genders.id', '=','users.gender')
                            ->select('users.*','genders.*','users.id as users_id','users.name as users_name','genders.id as genders_id','genders.name as genders_name')
                            ->where('users.id',$id)->first();
TsaiKoga
  • 12,914
  • 2
  • 19
  • 28
0

You're getting multiple records if you use get() method.

using get();

$accounts = DB::table('users')
           ->join('genders','genders.id', '=','users.gender')
           ->select('users.*','genders.*','users.id as users_id','users.name as users_name','genders.id as genders_id','genders.name as genders_name')
           ->where('users.id',$id)->get();

Blade file

@foreach($accounts as $account)
    {{ $account->users_name }}
@endforeach

using first() you'll get only one collection.

$accounts = DB::table('users')
           ->join('genders','genders.id', '=','users.gender')
           ->select('users.*','genders.*','users.id as users_id','users.name as users_name','genders.id as genders_id','genders.name as genders_name')
           ->where('users.id',$id)->first();

Blade file

{{ $account->users_name }}
Dilip Hirapara
  • 14,810
  • 3
  • 27
  • 49