Получение моего отжимого класса работать, как и должноPhp

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Получение моего отжимого класса работать, как и должно

Сообщение 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>
Я надеюсь, что любой может помочь заметить мои ошибки. Заранее спасибо

Подробнее здесь: https://stackoverflow.com/questions/797 ... -it-should
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»