ModelResource

Запросы

Скринкасты

Запросы

Часто необходимо изначально изменить все запросы ресурса к базе данных. Вы можете легко переопределить QueryBuilder в ресурсе.

 namespaces
use Illuminate\Contracts\Database\Eloquent\Builder;
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function modifyQueryBuilder(Builder $builder): Builder
{
return $builder->where('active', true);
}
}
 namespaces
use Illuminate\Contracts\Database\Eloquent\Builder;
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function modifyQueryBuilder(Builder $builder): Builder
{
return $builder->where('active', true);
}
}

Если вам необходимо полностью переопределить Builder, то вы можете переопределить метод ресурса newQuery().

Получение записи

Метод modifyItemQueryBuilder() используется, если вам нужно модифицировать запрос для получения записи из базы данных.

 namespaces
use Illuminate\Contracts\Database\Eloquent\Builder;
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function modifyItemQueryBuilder(Builder $builder): Builder
{
return $builder->withTrashed();
}
}
 namespaces
use Illuminate\Contracts\Database\Eloquent\Builder;
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function modifyItemQueryBuilder(Builder $builder): Builder
{
return $builder->withTrashed();
}
}

Если вам необходимо полностью переопределить Builder для получения записи, то вы можете переопределить метод ресурса findItem().

Eager load

 namespaces
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
protected array $with = ['user', 'categories'];
 
// ...
}
 namespaces
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
protected array $with = ['user', 'categories'];
 
// ...
}

Метод searchQuery() позволяет переопределить запрос при поиске записей.

 namespaces
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function searchQuery(string $terms): void
{
$this->newQuery()->where(function (Builder $builder) use ($terms): void {
// Your logic
});
}
}
 namespaces
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function searchQuery(string $terms): void
{
$this->newQuery()->where(function (Builder $builder) use ($terms): void {
// Your logic
});
}
}

Если вы хотите только расширить запрос, то необходимо вызвать родительский метод.

 namespaces
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function searchQuery(string $terms): void
{
parent::searchQuery($terms);
 
$this->newQuery()->where(function (Builder $builder) use ($terms): void {
// Your logic
});
}
}
 namespaces
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function searchQuery(string $terms): void
{
parent::searchQuery($terms);
 
$this->newQuery()->where(function (Builder $builder) use ($terms): void {
// Your logic
});
}
}

Также вы можете полностью переопределить логику, включая и полнотекстовый поиск.

protected function resolveSearch(string $terms, ?iterable $fullTextColumns = null): static
{
// Your logic
 
return $this;
}
protected function resolveSearch(string $terms, ?iterable $fullTextColumns = null): static
{
// Your logic
 
return $this;
}

Сортировка

Переопределив метод resolveOrder(), вы можете настроить сортировку записей.

 namespaces
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function resolveOrder(string $column, string $direction, ?Closure $callback): static
{
if ($callback instanceof Closure) {
$callback($this->newQuery(), $column, $direction);
} else {
$this->newQuery()->orderBy($column, $direction);
}
 
return $this;
}
}
 namespaces
use MoonShine\Laravel\Resources\ModelResource;
 
class PostResource extends ModelResource
{
// ...
 
protected function resolveOrder(string $column, string $direction, ?Closure $callback): static
{
if ($callback instanceof Closure) {
$callback($this->newQuery(), $column, $direction);
} else {
$this->newQuery()->orderBy($column, $direction);
}
 
return $this;
}
}