Сохранение изображений в связанной таблице
Для решения этой задачи необходимо заблокировать метод onApply()
и перенести логику в onAfterApply()
.
Это позволит получить родительскую модель на странице создания. У нас будет доступ к модели, и мы сможем работать с ее отношениями.
Метод onAfterApply()
сохраняет и получает старые и текущие значения, а также очищает удаленные файлы.
После удаления родительской записи метод onAfterDestroy()
удаляет загруженные файлы.
use MoonShine\UI\Fields\Image;use Illuminate\Database\Eloquent\Model;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Storage;// ...Image::make('Images', 'images')->multiple()->removable()->changeFill(function (Model $data, Image $field) {// return $data->images->pluck('file');// или rawreturn DB::table('images')->pluck('file');})->onApply(function (Model $data): Model {// блокируем onApplyreturn $data;})->onAfterApply(function (Model $data, false|array $values, Image $field) {// $field->getRemainingValues(); значения, которые остались в форме с учетом удалений// $field->toValue(); текущие изображения// $field->toValue()->diff($field->getRemainingValues()) удаленные изображенияif($values !== false) {foreach ($values as $value) {DB::table('images')->insert(['file' => $field->getApplyClass()->store($field, $value),// or 'file' => $value->store(),]);}}foreach ($field->toValue()->diff($field->getRemainingValues()) as $removed) {DB::table('images')->where('file', $removed)->delete();Storage::disk('public')->delete($removed);}// или $field->removeExcludedFiles();return $data;})->onAfterDestroy(function (Model $data, mixed $values, Image $field) {foreach ($values as $value) {Storage::disk('public')->delete($value);}return $data;})// ...
use MoonShine\UI\Fields\Image;use Illuminate\Database\Eloquent\Model;use Illuminate\Support\Facades\DB;use Illuminate\Support\Facades\Storage;// ...Image::make('Images', 'images')->multiple()->removable()->changeFill(function (Model $data, Image $field) {// return $data->images->pluck('file');// или rawreturn DB::table('images')->pluck('file');})->onApply(function (Model $data): Model {// блокируем onApplyreturn $data;})->onAfterApply(function (Model $data, false|array $values, Image $field) {// $field->getRemainingValues(); значения, которые остались в форме с учетом удалений// $field->toValue(); текущие изображения// $field->toValue()->diff($field->getRemainingValues()) удаленные изображенияif($values !== false) {foreach ($values as $value) {DB::table('images')->insert(['file' => $field->getApplyClass()->store($field, $value),// or 'file' => $value->store(),]);}}foreach ($field->toValue()->diff($field->getRemainingValues()) as $removed) {DB::table('images')->where('file', $removed)->delete();Storage::disk('public')->delete($removed);}// или $field->removeExcludedFiles();return $data;})->onAfterDestroy(function (Model $data, mixed $values, Image $field) {foreach ($values as $value) {Storage::disk('public')->delete($value);}return $data;})// ...
В коде закомментирован вариант с отношением и приведен пример нативного получения путей к файлам из другой таблицы.