eComEvo
eComEvo

Reputation: 12589

Excluding Laravel appends values from model results

Laravel has the option to add an $appends array to each model making additional values automatically available as if they are database attributes by adding accessors for each.

This is normally pretty handy, except in this case I need to ONLY get the fields I put into select() because DataTables is expecting only what I send to it.

Example:

Item::select(['image', 'name', 'color']);

Will return appended fields after color in the attributes.

How do I force the exclusion of the appends values when returning results?

Or alternatively, how do I get DataTables to ignore certain attributes?

Not sure which is the least time costly route.

Currently using yajra/laravel-datatables package to send data to the jQuery DataTables AJAX request.

Upvotes: 3

Views: 5409

Answers (2)

eComEvo
eComEvo

Reputation: 12589

To solve this I added this method to my Item model:

public static function getAppends()
{
    $vars = get_class_vars(__CLASS__);

    return $vars['appends'];
}

Then used the following code in the controller:

$items = Item::select(['image', 'name', 'color']);

$DT = Datatables::of($items);

call_user_func_array([$DT, 'removeColumn'], Item::getAppends()); // Has to be called this way with yajra/laravel-datatables-oracle v3.* if passing an array.

return $DT->make(true);

Upvotes: 1

Milan Maharjan
Milan Maharjan

Reputation: 4246

You can call each function in the collection object and then use setHidden method to exclude the unwanted fields like this

$item= Item::select(['image', 'name', 'color'])->get()->each(function($row){
                    $row->setHidden(['appendedField1', 'appendedField2']);
                });

And for the yajra/laravel-datatables you can use something like

$item= Item::select(['image', 'name', 'color']);
return Datatables::of($item)->remove_column('appendedField1');

Upvotes: 3

Related Questions