Skip to content

Instantly share code, notes, and snippets.

@dmason30
Created November 1, 2022 10:33
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 dmason30/0f8d725ac9f6af88aecf402b10167641 to your computer and use it in GitHub Desktop.
Save dmason30/0f8d725ac9f6af88aecf402b10167641 to your computer and use it in GitHub Desktop.
Laravel Nova -> Lens to duplicate resource fields
<?php
namespace App\Nova\Lenses;
use Laravel\Nova\Http\Requests\LensRequest;
use Laravel\Nova\Http\Requests\NovaRequest;
use Laravel\Nova\Http\Requests\ResourceIndexRequest;
use Laravel\Nova\Lenses\Lens as NovaLens;
use Laravel\Nova\Resource;
abstract class Lens extends NovaLens
{
public static function query(LensRequest $request, $query)
{
$resource = $request->resource();
return ResourceIndexRequest::createFrom($request)->toQuery()->with($resource::$with);
}
public function fields(NovaRequest|LensRequest $request)
{
return $this->getLensResource($request)->fields($request);
}
public function filters(NovaRequest|LensRequest $request)
{
return $this->getLensResource($request)->filters($request);
}
public function availableFields(NovaRequest $request)
{
return parent::availableFields($request)
->whereNotIn('component', ['belongs-to-many-field', 'has-many-field'])
->where('showOnIndex', true);
}
private function getLensResource(NovaRequest|LensRequest $request): Resource
{
$resource = $request->resource();
$model = $this->resource instanceof $resource::$model ? $this->resource : new $resource::$model();
return $request->newResourceWith($model);
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment