Chciałbym móc dodać niestandardowy atrybut / właściwość do modelu Laravel / Eloquent, gdy jest on ładowany, podobnie jak w przypadku $model->open()
metody RedBean .
Na przykład w tym momencie w moim kontrolerze mam:
public function index()
{
$sessions = EventSession::all();
foreach ($sessions as $i => $session) {
$sessions[$i]->available = $session->getAvailability();
}
return $sessions;
}
Byłoby miło móc pominąć pętlę i mieć ustawiony i wypełniony atrybut „dostępny”.
Próbowałem użyć niektórych zdarzeń modelowych opisanych w dokumentacji, aby dołączyć tę właściwość podczas ładowania obiektu, ale jak dotąd nie powiodło się.
Uwagi:
- „dostępny” nie jest polem w podstawowej tabeli.
$sessions
jest zwracany jako obiekt JSON jako część API, a zatem wywołanie czegoś takiego jak$session->available()
w szablonie nie jest opcją
protected $hidden = []
aby dodać kolumny / akcesoria, aby wykluczyć.Ostatnią rzeczą, na stronie doc laravel wymowny jest:
Można tego użyć automatycznie, aby dodać nowe akcesoria do modelu bez dodatkowej pracy, takiej jak modyfikowanie metod takich jak
::toArray()
.Wystarczy utworzyć
getFooBarAttribute(...)
akcesor i dodaćfoo_bar
do$appends
tablicy.źródło
toArray
metody.Jeśli zmienisz nazwę swojej
getAvailability()
metody nagetAvailableAttribute()
metodę, staniesz się akcesorium i będziesz mógł odczytać ją->available
bezpośrednio na swoim modelu.Dokumenty: https://laravel.com/docs/5.4/eloquent-mutators#accessors-and-mutators
EDYCJA: Ponieważ twój atrybut jest „wirtualny”, nie jest domyślnie uwzględniony w reprezentacji JSON twojego obiektu.
Ale znalazłem to: akcesoria modelu niestandardowego nie są przetwarzane, gdy wywoływane jest -> toJson ()?
Aby wymusić zwrócenie atrybutu w tablicy, dodaj go jako klucz do tablicy $ atrybuty.
Nie przetestowałem tego, ale powinno być dość trywialne, aby wypróbować w obecnej konfiguracji.
źródło
->available
udostępnia się na$session
obiekcie, ale ponieważ$sessions
jest konwertowane bezpośrednio na ciąg JSON (jest to część interfejsu API), nie ma szansy na użycie tego.EventSession::all()
zwraca obiekt JSON z interfejsu API, tak naprawdę nie używasz modelu Laravela, prawda? Przepraszam, nie jestem pewien, jak wdrożyłeś swój model.class EventSession extends Eloquent
).::all()
jest tylko przykładem.EventSession::find(170071)
byłby inny. Są one wywoływane w różnych punktach w całej SessionController (SessionController extends \BaseController
), które byłyby wywoływane za pomocą adresów URL, takich jak „/ session / 170071”.public $available
do modelu, nie zostanie to pokazane podczas konwersji obiektu.protected $appends = array('is_admin');
)Miałem coś podobnego: w moim modelu mam obraz atrybutu, który zawiera lokalizację pliku w folderze Storage. Obraz musi zostać zwrócony w formacie base64
źródło
możesz użyć
setAttribute
funkcji w Modelu, aby dodać niestandardowy atrybutźródło
Załóżmy, że masz 2 kolumny o nazwie imię i nazwisko w tabeli użytkowników i chcesz odzyskać pełną nazwę. możesz osiągnąć za pomocą następującego kodu:
teraz możesz uzyskać pełną nazwę jako:
źródło
Krok 1: Zdefiniuj atrybuty w
$appends
kroku 2: Zdefiniuj akcesorium dla tych atrybutów.
Przykład:
źródło
W moim modelu subskrypcji muszę wiedzieć, że subskrypcja jest wstrzymana, czy nie. oto jak to zrobiłem
następnie w szablonie widoku mogę użyć,
$subscription->is_paused
aby uzyskać wynik.Jest
getIsPausedAttribute
to format ustawienia niestandardowego atrybutu,i używa,
is_paused
aby uzyskać lub użyć atrybutu w Twoim widoku.źródło
w moim przypadku utworzenie pustej kolumny i ustawienie jej akcesorium działało poprawnie. mój akcesorium wypełnia wiek użytkownika z kolumny dob. Działa również funkcja toArray ().
źródło