File: /home/hasdeuac-119/has.deu.ac.kr/app/Fields/BelongsToManyBooleanGroup.php
<?php
namespace App\Fields;
use Illuminate\Support\Collection;
use Laravel\Nova\Fields\BooleanGroup;
use Laravel\Nova\Http\Requests\NovaRequest;
class BelongsToManyBooleanGroup extends BooleanGroup
{
private string $attributeName;
private string $targetClass;
private string $keyAttribute;
public function __construct($name, $attribute = null, callable $resolveCallback = null, $targetClass = null, $labelAttribute = 'name', $keyAttribute = 'id')
{
$this->attributeName = $attribute;
parent::__construct(
$name,
$attribute,
$resolveCallback ?? static function (Collection $models) {
return $models->mapWithKeys(function ($model) {
return [$model->getKey() => true];
});
}
);
$this->keyAttribute = $keyAttribute;
$this->targetClass = $targetClass;
$options = $targetClass::get()->pluck($labelAttribute, $keyAttribute)->toArray();
$this->options($options);
}
/**
* @param NovaRequest $request
* @param string $requestAttribute
* @param string $attribute
*/
protected function fillAttributeFromRequest(NovaRequest $request, $requestAttribute, $model, $attribute)
{
if (! $request->exists($requestAttribute)) {
return;
}
$model->{$this->attributeName}()->detach();
$targetClass = $this->targetClass;
$keyAttribute = $this->keyAttribute;
$attributeName = $this->attributeName;
collect(json_decode($request[$requestAttribute], true))
->filter(static function (bool $value) {
return $value;
})
->keys()
->map(static function ($itemId) use ($model,$targetClass,$keyAttribute,$attributeName) {
$item = $targetClass::query()->where($keyAttribute, $itemId)->first();
$model->{$attributeName}()->sync($item, false);
return $itemId;
});
}
}