Переменная Laravel к предложению where - PullRequest
0 голосов
/ 25 ноября 2018

Я пытаюсь расширить одно приложение для использования моего нового приложения Laravel.В этом сценарии я получаю неизвестное количество фильтров и хочу перенаправить их все в предложение where().

Я сделал что-то вроде этого:

private function filterConverter($filter)
{
    $f = [];
    foreach ($filter as $singleFilter) {
        $operator = $this->filterValues[$singleFilter['operator']];
        $value = $operator == 'like' ? '%' . $singleFilter['value'] . '%' : $singleFilter['value'];

        $f[] = $singleFilter['field'] . ',' . $operator . ',' . $value;
    }

    return $f;
}

Дело в том, что я получаю операторов типа EQUALS и CONTAINS, поэтому мне нужно преобразовать их в = и LIKE.

С помощью этого кода я пытаюсь сделать это:

return response(MyModel::where($filter)->get());

Но это не работает.Есть какой-нибудь элегантный способ решить эту проблему?

РЕДАКТИРОВАТЬ / РЕШЕНИЕ

Извините за @ HCK , так как я не мог принять ответ с тех порэто не отвечает на мой вопрос, но оно указало мне на правильный путь.Решением было использование ключей key, operator, value в массиве вместо того, что было у меня без ключа.

private function filterConverter($filters)
{
    $filter = [];
    foreach ($filters as $singleFilter) {
        $operator = $this->filterMap[$singleFilter['operator']];
        $value = $operator == 'LIKE' ? '%' . $singleFilter['value'] . '%' : $singleFilter['value'];

        $filter[] = [
            'key'      => $singleFilter['field'],
            'operator' => $operator,
            'value'    => $value
        ];
    }

    return $filter;
}

Ответы [ 2 ]

0 голосов
/ 25 ноября 2018

Не самый лучший способ решить эту проблему, но это должно сработать:

private function filterConverter($filters)
{
    return collect($filters)->map(function ($filter) {  // <---
        if($filter['operator'] == 'CONTAINS')
        {
            $filter['value'] = '%' . $filter['value'] . '%';
            $filter['operator'] = 'LIKE';
        }
        else if ($filter['operator'] == 'EQUALS')
        {
            $filter['operator'] = '=';
        }

        return collect($filter)->flatten(); // <---
    })->toArray(); // <---
}

Здесь я использую функцию Map() из Collection учебный класс.* * * * * * * * * * * * * * * * * * * * * *> * * * * * * * * * * * * * * * * * * * * * * - «».

0 голосов
/ 25 ноября 2018

Вы можете следовать по этому пути

DB::table('users')
        ->where(function($query) use ($filter)
        {
            // You able to access $filter here
            // You may able to to generate this block by loop
            $query->where('votes', '>', 100)
                  ->where('title', '<>', 'Admin');
        })
        ->get();

Laravel Doc |Расширенный Wheres

Эксп-1

    $filters = [
        ['key' => 'votes', 'operator' => '>', 'value' => 100]
    ];

    DB::table('users')
        ->where(function ($query) use ($filters) {
            foreach ($filters as $filter) {
                if (@$filter['key'] && @$filter['operator'] && @$filter['value']) {
                    $query->where($filter['key'], $filter['operator'], $filter['value']);
                }
            }
        })->get();

Эксп-2

    $filters = [
        ['key' => 'votes', 'operator' => '>', 'value' => 100]
    ];

    DB::table('users')
        ->where(function ($query) use ($filters) {
            foreach ($filters as $filter) {
                if (@$filter['key'] && @$filter['operator'] && @$filter['value']) {
                    $query->whereRaw("{$filter['key']} {$filter['operator']} '{$filter['value']}'");
                }
            }
        })->get();

Вы также можете использовать функцию объема Ref

Exp-3 Laravel Scope

class User extends Model
{
    public function scopeFilter($query, $filters)
    {
        foreach ($filters as $filter) {
            if (@$filter['key'] && @$filter['value']) {
                $query->where($filter['key'], @$filter['operator']?:"=", $filter['value']);
            }
        }

        return $query;
    }
}

// Use
User::filter($filters)->get();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...