#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])