2015-10-29 2 views
3

Laravel имеет возможность добавить массив $appends к каждой модели, делая автоматически доступными дополнительные значения, как если бы они были атрибутами базы данных, добавляя для каждого из них атрибуты доступа.Исключение Laravel добавляет значения из результатов модели

Это, как правило, очень удобно, за исключением того, что в этом случае мне нужно ТОЛЬКО получать поля, которые я помещаю в select(), потому что DataTables ожидает только того, что я ему отправляю.

Пример:

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

Вернется добавляются поля после color в атрибутах.

Как принудительно исключить значения добавлений при возврате результатов?

Или, как же заставить DataTables игнорировать определенные атрибуты?

Не уверен, что это наименее затратный маршрут.

В настоящее время используется пакет yajra/laravel-datatables для отправки данных в запрос AJAX данных DataQuery.

ответ

3

Вы можете вызвать каждую функцию в объекте коллекции, а затем использовать setHidden метод, чтобы исключить нежелательные поля как этот

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

А для yajra/Laravel-DataTables вы можете использовать что-то вроде

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

К сожалению, я не могу использовать 'получить()' о результатах, прежде чем перейти к 'yajra/Laravel-datatables' пакет, который передает его в пакет JQuery DataTables над AJAX. Забыл упомянуть этот пакет. В противном случае это было бы идеальным решением! – eComEvo

+0

Я думаю, вы можете использовать метод remove_column ('columnName') в пакете yajra/laravel-datatables. –

+0

Чтобы решить эту проблему, я сделал публикацию '$ appends' на моей модели' Item', создал var '$ DT = Datatables :: of ($ items);' и затем использовал 'call_user_func_array ([$ DT, 'removeColumn'], $ items-> first() -> appends); 'перед возвратом' make() '. Должен быть назван таким образом с помощью yajra/laravel-datatables-oracle v3 при передаче массива. – eComEvo

1

чтобы решить эту проблему, я добавил этот метод к моей Item модели:

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

    return $vars['appends']; 
} 

Затем использовал следующий код в контроллере:

$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); 
Смежные вопросы