Я пишу многоразовую фильтральную черту для проектов Laravel. У меня это работает, но не идеально. Одна часть отлично работает, почему другая часть не дает ожидаемых результатов < /p>
Я пишу многоразовую фильтраруемую черту для проектов Laravel. Я работаю, но не идеально.
Это мой код черты < /p>
namespace Obrainwave\LaravelQueryFilters;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
trait Filterable
{
public function scopeFilter(Builder $query, Request | array | null $filters = null) : QueryFilter
{
$filterClass = $this->getFilterClass();
if (! class_exists($filterClass)) {
return $query;
}
$filter = (new $filterClass($filters))
->setBuilder($query)
->apply(); // automatically apply request/array filters
return $filter; // Now you can chain ->status(...)->role(...)->get()
}
protected function getFilterClass(): string
{
return str_replace('Models', 'Filters', static::class) . 'Filter';
}
}
< /code>
И это мой код класса Queryfilter < /p>
namespace Obrainwave\LaravelQueryFilters;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
abstract class QueryFilter
{
protected Builder|null $builder = null;
protected array $filters = [];
/**
* Accept request or array of filters
*/
public function __construct(Request|array|null $filters = null)
{
if ($filters instanceof Request) {
$this->filters = $filters->all();
} elseif (is_array($filters)) {
$this->filters = $filters;
}
}
/**
* Set the query builder instance
*/
public function setBuilder(Builder $builder): static
{
$this->builder = $builder;
return $this;
}
/**
* Apply the filters to the builder
*/
public function apply(): static
{
if (! $this->builder) {
throw new \Exception("Query builder is not set. Call setBuilder() first.");
}
foreach ($this->filters as $key => $value) {
if ($value !== null && method_exists($this, $key)) {
$this->$key($value);
}
}
return $this;
}
/**
* Return the underlying builder for final query
*/
public function get()
{
return $this->builder->get();
}
public function first()
{
return $this->builder->first();
}
public function toSql()
{
return $this->builder->toSql();
}
}
< /code>
Итак, моя проблема заключается в том, что он работает, когда я проходил методы цепочки
$users2 = User::filter(['status' => 'inactive', 'role' => 'admin']) ->status('inactive') ->role('admin') ->get();< /code> < /p>
Но он возвращает все строки, когда я делаю это
$users1 = User::filter(request())->get();< /code>
, что означает, что он не применяет фильтрацию по умолчанию < /p>
Я надеюсь, что любой может помочь заметить мои ошибки. Заранее спасибо
Подробнее здесь: https://stackoverflow.com/questions/797 ... -it-should
Получение моего отжимого класса работать, как и должно ⇐ Php
Кемеровские программисты php общаются здесь
-
Anonymous
1756487978
Anonymous
Я пишу многоразовую фильтральную черту для проектов Laravel. У меня это работает, но не идеально. Одна часть отлично работает, почему другая часть не дает ожидаемых результатов < /p>
Я пишу многоразовую фильтраруемую черту для проектов Laravel. Я работаю, но не идеально.
Это мой код черты < /p>
namespace Obrainwave\LaravelQueryFilters;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
trait Filterable
{
public function scopeFilter(Builder $query, Request | array | null $filters = null) : QueryFilter
{
$filterClass = $this->getFilterClass();
if (! class_exists($filterClass)) {
return $query;
}
$filter = (new $filterClass($filters))
->setBuilder($query)
->apply(); // automatically apply request/array filters
return $filter; // Now you can chain ->status(...)->role(...)->get()
}
protected function getFilterClass(): string
{
return str_replace('Models', 'Filters', static::class) . 'Filter';
}
}
< /code>
И это мой код класса Queryfilter < /p>
namespace Obrainwave\LaravelQueryFilters;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
abstract class QueryFilter
{
protected Builder|null $builder = null;
protected array $filters = [];
/**
* Accept request or array of filters
*/
public function __construct(Request|array|null $filters = null)
{
if ($filters instanceof Request) {
$this->filters = $filters->all();
} elseif (is_array($filters)) {
$this->filters = $filters;
}
}
/**
* Set the query builder instance
*/
public function setBuilder(Builder $builder): static
{
$this->builder = $builder;
return $this;
}
/**
* Apply the filters to the builder
*/
public function apply(): static
{
if (! $this->builder) {
throw new \Exception("Query builder is not set. Call setBuilder() first.");
}
foreach ($this->filters as $key => $value) {
if ($value !== null && method_exists($this, $key)) {
$this->$key($value);
}
}
return $this;
}
/**
* Return the underlying builder for final query
*/
public function get()
{
return $this->builder->get();
}
public function first()
{
return $this->builder->first();
}
public function toSql()
{
return $this->builder->toSql();
}
}
< /code>
Итак, моя проблема заключается в том, что он работает, когда я проходил методы цепочки
$users2 = User::filter(['status' => 'inactive', 'role' => 'admin']) ->status('inactive') ->role('admin') ->get();< /code> < /p>
Но он возвращает все строки, когда я делаю это
$users1 = User::filter(request())->get();< /code>
, что означает, что он не применяет фильтрацию по умолчанию < /p>
Я надеюсь, что любой может помочь заметить мои ошибки. Заранее спасибо
Подробнее здесь: [url]https://stackoverflow.com/questions/79750596/getting-my-filtrable-class-to-work-as-it-should[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия