В запросе Laravel / mySQL, как выбрать пользователей, сравнивая массивы (или как включить array_diff в предложении where)? - PullRequest
0 голосов
/ 18 февраля 2020

Qn в более простых терминах: Я ищу в качестве пользователя других пользователей. Все пользователи установили предпочитаемые языки и свободно говорят на них. Мне нужно выбрать пользователей, беглые языки которых соответствуют предпочтительным языкам этого пользователя. Оба языка свободно и предпочитаемые языки являются массивом (текстовые поля в БД, но через JSON cast). Как это сделать? (Кроме того, свободный язык является лишь одним из многих условий в запросе. Поэтому сама структура запроса не может быть изменена сейчас.)

Подробная информация о том, что было опробовано: Я получаю список пользователей в $users. Одно из условий требует, чтобы я сравнил preferredLanguages (это массив-> collection1) с fluentLanguages (это также массив-> collection2). Все значения preferredLanguages должны присутствовать в fluentLanguage. Итак, я использую array_diff и проверяю, получился ли результат null.

Вопрос в том, как использовать это в предложении where? Я могу использовать array_diff, скажем, в условии if, но я не знаю, использовать ли его в предложении where.

Я перепробовал все, что мог придумать, но пока ничего не работает! Может кто-нибудь помочь, пожалуйста?

$collection1=$preferrences->preferredLanguages;
$collection2='user_details.fluentLanguages';

$diff= array_diff($collection1, $collection1);

$users->where(function (Builder $query) use ($matchPref) {
        $query
           ->where($diff, '[]');  //I need to check if $diff is null/empty. I tried everything I can think of here. 
    });

Редактировать: Я попробовал что-то еще, как указано Кенни ниже. Я верю, что это может сработать, но пока не решило. Любая помощь приветствуется.

$users->filter(function ($user, $key) use ($preferrences->preferredLanguages)){
            return ! array_diff($user['fluentLanguages'], $preferrences->preferredLanguages);
        });

Я тоже пробовал где, но не получилось.

$users->where(array_diff('user_details.fluentLanguages', $preferrences->preferredLanguages)->IsEmpty(), true)

1 Ответ

1 голос
/ 18 февраля 2020

Одна стратегия, которая приходит мне в голову, может быть:

  1. Получите fluentLanguage каждого пользователя.
$candidates = User::select('id', 'fluentLanguage')->get();
Отфильтруйте их по условию.
$filtered = $candidates
                ->filter(function ($candidate, $key) use ($matchFluentIn) {
                    return ! array_diff($candidate['fluentLanguage'], $matchFluentIn);
                })
                ->pluck('id')
                ->all();
Получите полную информацию об этом фильтрованном списке пользователей:
$users = User::whereIn('id', $filtered)->get();

Надеюсь, это поможет.

...