RFFRED
4 months ago

yajra/eloquent datatable does not display anything for belongsTo relationship fields

Posted 4 months ago by RFFRED

Hi,

I have a belongs relationship I would like to display in a Yajrah datatable. I have the table working using DB but I want to get it to work using eloquent.

Working script using DB

 if ($request->ajax()) {

            $data = DB::table('log_activities')
                        ->join('admins', 'log_activities.admin_id', '=', 'admins.id')
                        ->whereIn('type', array('info'))
                        ->select(['log_activities.subject', 'log_activities.type', 'admins.first_name', 'admins.last_name', 'log_activities.created_at'])
                        ->latest();
            
            return Datatables::of($data)
                    ->addColumn('admin_name', function($row){
                        return $row->first_name.' '.$row->last_name;
                    })
                    ->setRowClass(function ($row) {
                        return $row->type; //The row class is set based on the log type 
                    })
                    ->make(true);
}

To change this for eloquent,

Migration

        Schema::create('log_activities', function (Blueprint $table) {
            $table->id(); //Alias of $table->bigIncrements('id')
            $table->string('subject', 5000);
            $table->string('url', 5000);
            $table->string('method',20);
            $table->string('ip',20);
            $table->string('agent')->nullable();
            $table->unsignedBigInteger('admin_id');
            $table->enum('type', ['info', 'notice', 'warning', 'error', 'critical', 'emergency'])->default('info');
            $table->timestamps();
        });

	Schema::table('log_activities', function($table)
        {
            $table->foreign('admin_id')->references('id')->on('admins');
        });



           Schema::create('admins', function (Blueprint $table) {
                $table->bigIncrements();
                $table->string('first_name');
                $table->string('last_name');
                $table->string('email')->unique();
                $table->timestamp('email_verified_at')->nullable();
                $table->string('password');
                $table->rememberToken();
                $table->timestamps();
                $table->softDeletes();
            });

relationship


class LogActivity extends Model
{
    /**
     * The attributes that are mass assignable.
     *
     * @var array
     */
    protected $fillable = [
        'subject', 'url', 'method', 'ip', 'agent', 'admin_id', 'type'
    ];


    public function admin()
    {
        return $this->belongsTo(Admin::class, 'admin_id', 'id');
    }

}

controller

         
	$query = LogActivity::select(['subject', 'type', 'created_at')->with('admin:id,first_name,last_name')->get();
            
            return Datatables::of($query)
                    ->addColumn('admin_name', function($row){
                        return $row->first_name.' '.$row->last_name;
                    })
                    ->setRowClass(function ($row) {
                        return $row->type; //The row class is set based on the log type 
                    })
                    ->make(true);

view

<script>
$(function() {

    $('#logs-table').DataTable({
        paging: true, // Allow data to be paged
        searching: true, // Search box and search function will be actived
        ordering: true,

        lengthMenu: [[1, 10, 25, 50, -1], [1, 10, 25, 50, "All"]],
        pageLength: 10,

        autoWidth: true,
        
        dom: 'Blfrtip', //DOM variable for each element of the datatable
        buttons: [
            'copy', 'csv', 'excel', 'pdf', 'print'
        ],

        processing: true,
        serverSide: true,

        ajax: '{!! route('admin.log.index') !!}',

        columns: [
            { data: 'subject', name: 'subject' },
            { data: 'admin_name', name: 'admin_name' },
            { data: 'created_at', name: 'created_at', orderable: false, searchable: false },
        ],

    });

});

</script>

I am not getting any error. I just get data displayed in admin_name column

In the below result, the admin relation does not return anything...

#items: array:17 [
    0 => RF\RFCmsLogs\Models\LogActivity {#1392
      #fillable: array:7 [
        0 => "subject"
        1 => "url"
        2 => "method"
        3 => "ip"
        4 => "agent"
        5 => "admin_id"
        6 => "type"
      ]
      #with: array:1 [
        0 => "admin"
      ]
      #connection: "mysql"
      #table: "log_activities"
      #primaryKey: "id"
      #keyType: "int"
      +incrementing: true
      #withCount: []
      #perPage: 15
      +exists: true
      +wasRecentlyCreated: false
      #attributes: array:3 [
        "subject" => "Permission Group "Logs" has been created."
        "type" => "info"
        "created_at" => "2020-06-15 22:36:14"
      ]
      #original: array:3 [
        "subject" => "Permission Group "Logs" has been created."
        "type" => "info"
        "created_at" => "2020-06-15 22:36:14"
      ]
      #changes: []
      #casts: []
      #classCastCache: []
      #dates: []
      #dateFormat: null
      #appends: []
      #dispatchesEvents: []
      #observables: []
      #relations: array:1 [
        "admin" => null
      ]
      #touches: []
      +timestamps: true
      #hidden: []
      #visible: []
      #guarded: array:1 [
        0 => "*"
      ]
    }

Any idea?

Just tried this

$records = LogActivity::all();

foreach($records as $r){
    print $r->admin->first_name;

}

and it works, so my belongsTo relationship must be properly setup...

Please sign in or create an account to participate in this conversation.