Где In в Query не работает для массива, любое решение? - PullRequest
0 голосов
/ 09 января 2020

Я определил scopeFilter в модели, которая имеет следующий код

public function scopeFilter($query, array $filters){
    $query->when($filters['subjects'] ?? null, function ($query, $data) {
        //Subjects ids will be comma seperated string eg : 127,125
        $subject_array = explode(',', htmlspecialchars_decode($data))
        $query->where(function ($query) use ($subject_array) {
            $query->whereIn('subjects_ids', $subject_array);
        });
    });
    $query->when($filters['topics'] ?? null, function ($query, $data) {
        //topics ids will be comma seperated string eg : 127,125
        $topic_array = explode(',', htmlspecialchars_decode($data))
        $query->where(function ($query) use ($topic_array) {
            $query->whereIn('topics_ids', $topic_array);
        });
    });
    $query->when($filters['search'] ?? null, function ($query, $search) {
        $query->where(function ($query) use ($search) {
            $query->where('name', 'like', '%'.$search.'%');
        });
    });
}

Вот как я использую это в контроллере

$exams = Exams::filter(\Request::only('search', 'subjects','topics'))
            ->orderBy('status', 'DESC')
            ->orderBy('updated_at', 'DESC')->transform(....);

Если это передается в URL-запросе тогда результат будет пустым. Я делаю что-то не так здесь?

В основном это три фильтра, поиск работает нормально, но темы и темы не будут работать.

Ответы [ 2 ]

0 голосов
/ 10 января 2020

Вы не вернули $ query в функции. Laravel Local Scope

public function scopeFilter($query, array $filters){
    $query->when($filters['subjects'] ?? null, function ($query, $data) {
        //Subjects ids will be comma seperated string eg : 127,125
        $subject_array = explode(',', htmlspecialchars_decode($data))
        $query->where(function ($query) use ($subject_array) {
            $query->whereIn('subjects_ids', $subject_array);
        });
    });
    $query->when($filters['topics'] ?? null, function ($query, $data) {
        //topics ids will be comma seperated string eg : 127,125
        $topic_array = explode(',', htmlspecialchars_decode($data))
        $query->where(function ($query) use ($topic_array) {
            $query->whereIn('topics_ids', $topic_array);
        });
    });
    $query->when($filters['search'] ?? null, function ($query, $search) {
        $query->where(function ($query) use ($search) {
            $query->where('name', 'like', '%'.$search.'%');
        });
    });
    return $query;
}

Надеюсь, это поможет вам:)

0 голосов
/ 09 января 2020

Думаю, вы пропустили return в рамках фильтра

...