Laravel получает модель без добавления атрибутов

#php #laravel #laravel-5 #eloquent #laravel-5.3

#php #laravel #laravel-5 #красноречивый #laravel-5.3

Вопрос:

Я работаю с Laravel 5.3, и в модели Post у меня есть атрибуты добавления :

 /*
* toJson
*/
protected $appends = ['count'];
  

И волшебный метод :

 public function getCountAttribute()
    {
        return Offer::where('id', '=', $this->id)->count();
    }
  

Итак, когда я получаю Post модель с eloquent like Post::get() и получаю возврат, например, с помощью json, у меня ВСЕГДА есть этот атрибут count в моем объекте.

Как я могу указать, хочу ли я или нет этот или другой атрибут добавления?

Комментарии:

1. Post::get() вы имеете в виду, что это недопустимый метод? all

2. Да, это было просто для примера

Ответ №1:

Я проверил, как сериализуются модели Eloquent, и, к сожалению, список добавляемых полей не является общим для всех экземпляров данной модели, и единственный способ, который я вижу для достижения того, что вам нужно, — это выполнить итерацию по результирующему набору и явно включить добавление для выбранных атрибутов:

 $posts = Post::all();

foreach ($posts as $post) {
  // if you want to add new fields to the fields that are already appended
  $post->append('count');

  // OR if you want to overwrite the default list of appended fields
  $post->setAppends(['count']);
}
  

Комментарии:

1. Не очень хорошая идея повторять каждый раз, когда я получаю данные, вместо этого лучше сохранить бесполезную переменную

2. Это правда, если вычисление значения обходится дешево. Если она включает в себя некоторую сложную логику, которая может привести к потере производительности, вы можете добавлять ее только при необходимости. В любом случае, это единственный способ выполнить условное добавление.

3. Хм, да, не очень хороший момент для Laravel ^^ Я работаю над API, и мне не нравится хранить бесполезные данные в моих разных веб-сервисах

Ответ №2:

Вы можете получить атрибуты модели, с $post->getAttributes() помощью которых возвращается массив атрибутов перед любым добавлением