Laravel / Eloquent – Яркие загруженные скрытые / видимые свойства

При использовании Larvel's Eloquent ORM я не могу показаться, что динамически меняет свойства $ hidden и $ visible на моей модели.

Пример 1: Это работает:

class User extends Eloquent { $this->visible = array('field_name'); function read() { return User::all(); } } 

Пример 2: Динамическое определение видимого свойства в классе Eloquent Class не работает:

 class User extends Eloquent { function read($visible = array('field_name')) { $this->visible = $visible; // Also tried: $this->setVisible($visible); return User::all(); } } 

Пример 3. Решение, которое работает на самой модели, но не на загруженных моделях. Модели:

 class User extends Eloquent { function read($visible = array('field_name')) { $users = User::all(); return $users->get()->each(function($row) use ($visible) { $row->setVisible($visible); }); } } 

Чтобы динамически отображать свойство $ visible в моделях с высокой нагрузкой, я не вижу другого решения, кроме как заставить пример 2 работать. Но как?

Поскольку $visible устанавливается на уровне экземпляра (т. Е. Это не статическая переменная, разделяемая между всеми моделями одного и того же типа), нет – лучшего способа сделать это нет.

Это то, что я придумываю для этой цели:

  use Illuminate\Database\Eloquent\Model; /* * trait sllows to use a single method: * getSerialized * this function works as the following method: * Illuminate\Database\Query\Builder::get(), * and also returns the collection * but accepts a parameter of an array type * like that * $records = Table1::getSerialized([ * 'appends' => ['calc_field1', 'calc_field2'], * 'hidden' => ['field1', 'field2', 'field3'], * 'visible' => ['id', 'name', 'calc_field1', 'calc_field2'], * ]); * * the returned collection accords with params * read more in Laravel documentation * https://laravel.com/docs/5.1/eloquent-serialization */ trait Serialization { // scope filters --------------------------------------------------------- private static $staticAppends; private static $staticHidden; private static $staticVisible; public function __construct(array $attributes = []){ parent::__construct($attributes); if (isset(self::$staticAppends)){ $this->appends = self::$staticAppends; } if (isset(self::$staticHidden)){ $this->hidden = self::$staticHidden; } if (isset(self::$staticVisible)){ $this->visible = self::$staticVisible; } } public function scopeGetSerialized($query, array $params){ if (isset(self::$staticAppends)){ $staticAppends = self::$staticAppends; } else { $staticAppends = []; } if (isset(self::$staticHidden)){ $staticHidden = self::$staticHidden; } else { $staticHidden = []; } if (isset(self::$staticVisible)){ $staticVisible = self::$staticVisible; }else { $staticVisible = []; } if (isset($params['appends'])){ self::$staticAppends = $params['appends']; } if (isset($params['hidden'])){ self::$staticHidden = $params['hidden']; } if (isset($params['visible'])){ self::$staticVisible = $params['visible']; } $res = $query->get(); self::$staticAppends = $staticAppends; self::$staticHidden = $staticHidden; self::$staticVisible = $staticVisible; return $res; } }