Mam projekt Laravel (właściwie projekt Laravel Nova), który wymaga wprowadzenia dużej ilości danych. Aby zaoszczędzić trochę czasu, chciałbym wstępnie wypełnić niektóre pola w moim formularzu na podstawie ostatniego wpisu zalogowanego użytkownika.

Mogę wstępnie wypełnić pola za pomocą zmiennej $ attributes w moim modelu o nazwie Product, na przykład:

protected $attributes = [
  'category' => 'ABC'
];

Mogę to zrobić dla bardziej dynamicznych danych w konstruktorze, na przykład:

function __construct() {
  $this->attributes['category'] = Str::random();
  parent::__construct();
}

Ale nie jestem do końca pewien, jak bym to zrobił, gdy chcę odzyskać to, co użytkownik wprowadził ostatnio. Na przykład chciałbym to zrobić:

function __construct() {
  $user = auth()->user()->id;
  $last = Product::where('created_by', $user)->latest()->first();
  $this->attributes['category'] = $last['category'] ?? null;
}

Jednak kończy się to nieskończoną pętlą. To samo, jeśli zadzwonię $this->where('created_by' ...

Czy istnieje sposób, aby ustawić $attributes nowego Product na podstawie ostatniego Product utworzonego przez użytkownika?

0
Grayda 5 marzec 2020, 04:52

2 odpowiedzi

Najlepsza odpowiedź

Znalazłem rozwiązanie w pakiecie Nova Defaultable.

Po dodaniu niezbędnych cech możesz po prostu dodać ->defaultLast() do pola zasobu, a domyślnie zostanie ustawiona ostatnia ustawiona wartość. Działa to również w przypadku relacji, które są idealne dla mojego przypadku użycia.

0
Grayda 23 marzec 2020, 10:50

Pola Nova mają metodę resolveUsing, więc w twoim przypadku, jeśli chcesz wypełnić pole tekstowe:

Text::make('Category')->resolveUsing(function () {
    return optional(auth()->user()->products()->latest()->first())->category;
})
1
mervasdayi 16 marzec 2020, 07:15