Skip to content

Instantly share code, notes, and snippets.

@Muetze42
Last active November 10, 2021 09:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Muetze42/f6f3d34b0ed02d20484160736d089be8 to your computer and use it in GitHub Desktop.
Save Muetze42/f6f3d34b0ed02d20484160736d089be8 to your computer and use it in GitHub Desktop.
Nova: Prevent duplicate relation attachment
<?php
namespace App\Traits\Nova;
use Illuminate\Database\Eloquent\Builder;
use Laravel\Nova\Http\Controllers\AttachableController;
use Laravel\Nova\Http\Requests\NovaRequest;
trait NoDuplicateRelations
{
/**
* Build a "relatable" query for the given resource.
*
* This query determines which instances of the model may be attached to other resources.
*
* @param NovaRequest $request
* @param Builder $query
* @return Builder
*/
public static function relatableQuery(NovaRequest $request, $query): Builder
{
if ($request->route()->getController() instanceof AttachableController) {
$key = $query->getModel()->getQualifiedKeyName();
return $query->where(function (Builder $builder) use ($key, $query, $request) {
$builder->whereNotIn($key, function ($subQuery) use ($key, $query, $request) {
$subQuery->fromSub(
$request->findModelOrFail()->{$request->field}()->select($key)->getQuery(),
'tmp'
);
})->when($request->get('current'), function (Builder $builder, $current) use ($key) {
$builder->orWhere($key, $current);
});
});
}
return parent::relatableQuery($request, $query);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment