#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()
помощью которых возвращается массив атрибутов перед любым добавлением