как использовать предложение where, чтобы узнать, существует ли идентификатор в столбце типа массива postgres

#javascript #node.js #arrays #postgresql #knex.js

#javascript #node.js #массивы #postgresql #knex.js

Вопрос:

Что я пытаюсь сделать, так это объединить таблицу «события» с двумя другими таблицами: «пользователи» и «местоположения». Каждое «событие» происходит в определенное время и в определенном «местоположении», к которому необходимо присоединиться, чтобы пользователь знал, где произойдет событие. А также создается конкретным «пользователем». у этого пользователя есть массив идентификаторов пользователей с именем close_friends . Три таблицы следующие:

 Events table
===================================================
        Column         |           Type           |
----------------------- -------------------------- 
 id                    | integer                  |
 location_id           | integer                  |
 guests                | integer                  |
 hide_from             | integer[]                |
 only_close_friends    | boolean                  |
 is_public             | boolean                  |
 min_viable_population | integer                  |
 max_viable_population | integer                  |
 created_by            | integer                  |
 sport_type            | text                     |
 whats_needed          | text[]                   |
 happens_at            | timestamp with time zone |
 created_at            | timestamp with time zone |
 updated_at            | timestamp with time zone |
 updated_by            | integer                  |
___________________________________________________

Users table
===========================================
    Column     |           Type           |
--------------- -------------------------- 
 id            | integer                  |
 username      | text                     |
 password_hash | text                     |
 first_name    | text                     |
 last_name     | text                     |
 gender        | text                     |
 photo         | text                     |
 city          | text                     |
 bio           | text                     |
 height        | integer                  |
 sports        | text[]                   |
 photos        | text[]                   |
 friends       | integer[]                |
 close_friends | integer[]                |
 scopes        | text[]                   |
 verified      | boolean                  |
 created_at    | timestamp with time zone |
 updated_at    | timestamp with time zone |
 updated_by    | integer                  |
___________________________________________

Locations table
==========================================
    Column     |           Type           |
--------------- -------------------------- 
 id            | integer                  |
 name          | text                     |
 maps_url      | text                     |
 city          | text                     |
 region        | text                     |
 cost          | text                     |
 photo         | text                     |
 meta          | text                     |
 sport_types   | text[]                   |
 girls_allowed | boolean                  |
 verified      | boolean                  |
 created_at    | timestamp with time zone |
 created_by    | integer                  |
 updated_at    | timestamp with time zone |
 updated_by    | integer                  |
  

Теперь пользователь должен иметь возможность создавать событие, которое видно только его / ее близким друзьям.
что я хочу сделать, так это получать только те события, которые должны быть видны близким друзьям создателя.
Чтобы дать вам общее представление о том, чего я пытаюсь достичь, я бы предоставил вам блок кода, который выглядит хорошо, но возвращает ошибку «Оператор не существует».

 const query = db('events')
      .join('users', 'users.id', '=', 'events.created_by')
      .join('locations', 'locations.id', '=', 'events.location_id')
      .select(
        'events.id',
        'events.location_id',
        'locations.name',
        'events.guests',
        'locations.city',
        'events.min_viable_population',
        'events.max_viable_population',
        'events.created_by',
        'events.sport_type',
        'events.whats_needed',
        'events.happens_at',
        'events.created_at',
        'users.username',
        'users.first_name',
        'users.last_name',
        'users.photo',
        'users.verified'
      )
     .where({'only_close_friends': true})
     .whereIn('close_friends', function () {        /////////////////////////
        this.select('id')                           /////////////////////////
          .from('users')                            // The problem is here // 
          .where({ id: user_id })                   ///////////////////////// 
      })                                            /////////////////////////
  

Примечание

«user_id» — это идентификатор правильно вошедшего в систему пользователя.

Ответ №1:

Я смог найти простое решение с помощью друга:

 .whereRaw('? = ANY(users.close_friends)',[user_id])