Jasbin Karki
Jasbin Karki

Reputation: 614

OneToOne Relationship in DataTables

I am using datatables from https://datatables.net/examples/server_side/simple.html and I am able to display all the information to the tables.

Now I have a column which stores foreign key as shown below. enter image description here

The other table which is being pointed by source_of_member is enter image description here

so here i have these kind of relationship and in frontend datatables my data are visualized as enter image description here

Howeber here instead of foreign keys in Member Source column I want those Name to appear from another table which matches the id my member model is as:

class Member extends Model
{
    protected $fillable = ['name','mobile_number','organization_name','source_of_member','relationship_manager','referred_by'];

    public function memberSource()
    {
        return $this->hasOne('App\MemberSource', 'id');
    }
}

and my memberSource model is as:

class MemberSource extends Model
{
    protected $fillable = ['name'];

    public function member()
    {
        return $this->hasOne('App\Member', 'id');
    }
}

what i tried is:

public function getdata()
    {
        $members = Member::all();
        return Datatables::of($members)
            ->addColumn('action', function($member){
                return '<a data-id="'.$member->id.'" href="#" data-toggle="modal" id="openShow" class="btn btn-info btn-xs"><i class="fas fa-eye"></i></a> ' .
                    '<a href="member/edit/'.$member->id.'" class="btn btn-primary btn-xs"><i class="fas fa-edit"></i></a> ' .
                    '<a href="member/delete/'.$member->id.'" class="btn btn-danger btn-xs"><i class="fas fa-trash-alt"></i></a>';
            })
            ->make(true);
    }

i dont know how to do this any help would be greatly appreciated.

Upvotes: 0

Views: 79

Answers (2)

Manisha
Manisha

Reputation: 80

In your Member model:

public function memberSource()
{
    return $this->hasOne('App\MemberSource', 'source_of_member');
}

In Controller:

$members = Member::with('memberSource')->get();
return Datatables::of($members)
            ->addColumn('source_of_member', function ($member) {
               $member_name = '';
               if(!empty($member->memberSource->name)){
                    $member_name = $member->memberSource->name;
               }
               return $member_name;
            })
            ->addColumn('action', function($member){
                return '<a data-id="'.$member->id.'" href="#" data-toggle="modal" id="openShow" class="btn btn-info btn-xs"><i class="fas fa-eye"></i></a> ' .
                    '<a href="member/edit/'.$member->id.'" class="btn btn-primary btn-xs"><i class="fas fa-edit"></i></a> ' .
                    '<a href="member/delete/'.$member->id.'" class="btn btn-danger btn-xs"><i class="fas fa-trash-alt"></i></a>';
            })
            ->make(true);

Upvotes: 1

gbalduzzi
gbalduzzi

Reputation: 10176

With the relationships working properly, you can simply edit the column in the datatable:

$members = Member::with('memberSource');
return Datatables::of($members)
            ->editColumn('source_of_member', function ($member) {
              return $member->memberSource->name;
            })
            ->addColumn('action', function($member){
                return '<a data-id="'.$member->id.'" href="#" data-toggle="modal" id="openShow" class="btn btn-info btn-xs"><i class="fas fa-eye"></i></a> ' .
                    '<a href="member/edit/'.$member->id.'" class="btn btn-primary btn-xs"><i class="fas fa-edit"></i></a> ' .
                    '<a href="member/delete/'.$member->id.'" class="btn btn-danger btn-xs"><i class="fas fa-trash-alt"></i></a>';
            })
            ->make(true);

However, your relationship configuration seems wrong, because your foreign key is called source_of_member and therefore laravel can't automatically detect it.

In your Member model:

public function memberSource()
{
    return $this->hasOne('App\MemberSource', 'source_of_member');
}

In your MemberSource model:

public function member()
{
    return $this->belongsTo('App\Member', 'source_of_member');
}

Upvotes: 1

Related Questions