Я хотел бы иметь возможность добавить собственный атрибут / свойство в модель Laravel / Eloquent при его загрузке, аналогично тому, как этого можно добиться с помощью $model->open()
метода RedBean .
Например, на данный момент, в моем контроллере у меня есть:
public function index()
{
$sessions = EventSession::all();
foreach ($sessions as $i => $session) {
$sessions[$i]->available = $session->getAvailability();
}
return $sessions;
}
Было бы неплохо иметь возможность пропустить цикл и иметь уже установленный и заполненный атрибут 'available'.
Я попытался использовать некоторые из событий модели, описанных в документации, чтобы присоединить это свойство при загрузке объекта, но пока безуспешно.
Ноты:
- 'available' не является полем в базовой таблице.
$sessions
возвращается как объект JSON как часть API, и поэтому вызов чего-то похожего$session->available()
на шаблон не является опцией
protected $hidden = []
чтобы добавить исключаемые столбцы / методы доступа.Последнее , что на странице дока Laravel красноречивой является:
Это может быть использовано автоматически для добавления новых методов доступа к модели без какой-либо дополнительной работы, такой как изменение методов, таких как
::toArray()
.Просто создайте
getFooBarAttribute(...)
аксессор и добавьте егоfoo_bar
в$appends
массив.источник
toArray
метода.Если вы переименуете свой
getAvailability()
метод вgetAvailableAttribute()
свой метод, он станет средством доступа, и вы сможете читать его->available
прямо на вашей модели.Документы: https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
РЕДАКТИРОВАТЬ: Поскольку ваш атрибут является «виртуальным», он не включен по умолчанию в JSON-представление вашего объекта.
Но я обнаружил следующее: пользовательские методы доступа к моделям не обрабатываются при вызове -> toJson ()?
Чтобы заставить ваш атрибут возвращаться в массив, добавьте его в качестве ключа в массив $ attribute.
Я не проверял это, но для вас должно быть довольно тривиально попробовать в вашей текущей настройке.
источник
->available
доступно для$session
объекта, но так как оно$sessions
преобразуется непосредственно в строку JSON (это часть API), у вас нет шансов использовать это.EventSession::all()
возвращает объект JSON из API, вы на самом деле не используете модель Laravel, верно? Извините, я запутался в том, как вы реализовали свою модель.class EventSession extends Eloquent
).::all()
это просто в качестве примера.EventSession::find(170071)
было бы другое. Они вызываются в различных точках SessionController (SessionController extends \BaseController
), которые будут вызываться через URL-адреса, такие как «/ session / 170071».public $available
в модель, он не будет отображаться при преобразовании объекта.protected $appends = array('is_admin');
)У меня было что-то похожее: в моей модели есть изображение атрибута, в котором содержится местоположение файла в папке «Хранилище». Изображение должно быть возвращено в кодировке base64
источник
Вы можете использовать
setAttribute
функцию в модели, чтобы добавить пользовательский атрибутисточник
Допустим, у вас есть 2 столбца с именами first_name и last_name в вашей таблице пользователей, и вы хотите получить полное имя. Вы можете достичь с помощью следующего кода:
теперь вы можете получить полное имя как:
источник
Шаг 1: Определите атрибуты в
$appends
Шаге 2: Определите метод доступа для этих атрибутов.
Пример:
источник
В моей модели подписки мне нужно знать, что подписка приостановлена или нет. вот как я это сделал
затем в шаблоне представления я могу использовать,
$subscription->is_paused
чтобы получить результат.getIsPausedAttribute
Формат , чтобы установить пользовательский атрибут,и использует,
is_paused
чтобы получить или использовать атрибут в вашем представлении.источник
в моем случае создание пустого столбца и установка его метода доступа работали нормально. мой аксессор заполняет возраст пользователя из столбца доб. Функция toArray () тоже сработала.
источник