42 lines
1.3 KiB
PHP
42 lines
1.3 KiB
PHP
<?php
|
|
|
|
namespace Laravel\Nova\Fields;
|
|
|
|
use Laravel\Nova\Contracts\Deletable;
|
|
use Laravel\Nova\DeleteField;
|
|
use Laravel\Nova\Nova;
|
|
|
|
trait DetachesPivotModels
|
|
{
|
|
/**
|
|
* Get the pivot record detachment callback for the field.
|
|
*
|
|
* @return \Closure(\Laravel\Nova\Http\Requests\NovaRequest, mixed):bool
|
|
*/
|
|
protected function detachmentCallback()
|
|
{
|
|
return function ($request, $model) {
|
|
$pivotAccessor = $model->{$this->attribute}()->getPivotAccessor();
|
|
|
|
foreach ($model->{$this->attribute}()->withoutGlobalScopes()->cursor() as $related) {
|
|
$resource = Nova::newResourceFromModel($related);
|
|
|
|
$pivot = $related->{$pivotAccessor};
|
|
|
|
$pivotFields = $resource->resolvePivotFields($request, $request->resource);
|
|
|
|
$pivotFields->whereInstanceOf(Deletable::class)
|
|
->filter->isPrunable()
|
|
->each(function ($field) use ($request, $pivot) {
|
|
/** @var \Laravel\Nova\Fields\Field&\Laravel\Nova\Contracts\Deletable $field */
|
|
DeleteField::forRequest($request, $field, $pivot)->save();
|
|
});
|
|
|
|
$pivot->delete();
|
|
}
|
|
|
|
return true;
|
|
};
|
|
}
|
|
}
|