Условная цепочка запросов с объединением - PullRequest
0 голосов
/ 07 марта 2020

Попытка выполнить следующий запрос с knex:

builder.from(PageModel.tableName).where((builder) => {
      if (this.filters.accountId) {
        instance
          .innerJoin(
            PageAccountModel.tableName,
            `${PageModel.tableName}.id`,
            `${PageAccountModel.tableName}.pageId`,
          )
          .innerJoin(
            AccountModel.tableName,
            `${PageAccountModel.tableName}.accountId`,
            `${AccountModel.tableName}.id`,
          )
          .where(`${AccountModel.tableName}.id`, this.filters.accountId);
      }

      if (this.filters.type) {
        builder.where('type', this.filters.type);
      }
    });

Продолжать получать сообщение об ошибке:

error: missing FROM-clause entry for table "account"
at Connection.parseE (/home/jakov/Projects/platform/node_modules/pg/lib/connection.js:604:11)
at Connection.parseMessage (/home/jakov/Projects/platform/node_modules/pg/lib/connection.js:401:19)
at Socket.<anonymous> (/home/jakov/Projects/platform/node_modules/pg/lib/connection.js:121:22)
at Socket.emit (events.js:210:5)
at addChunk (_stream_readable.js:326:12)
at readableAddChunk (_stream_readable.js:301:11)
at Socket.Readable.push (_stream_readable.js:235:10)
at TCP.onStreamRead (internal/stream_base_commons.js:182:23)

ПРИМЕЧАНИЕ. Этот запуск выполняется изнутри объекта, поля которого фильтруют хранятся (уведомление this.filters).

РЕДАКТИРОВАТЬ: я хочу взять только таблицу page.

Ответы [ 2 ]

1 голос
/ 09 марта 2020

Если вы хотите написать запрос с условными частями, вы можете сделать это следующим образом:


const query = knex(PageModel.tableName);

if (this.filters.accountId) {
  query
    .innerJoin(
      PageAccountModel.tableName,
      `${PageModel.tableName}.id`,
      `${PageAccountModel.tableName}.pageId`,
    )
    .innerJoin(
      AccountModel.tableName,
      `${PageAccountModel.tableName}.accountId`,
      `${AccountModel.tableName}.id`,
    )
    .where(`${AccountModel.tableName}.id`, this.filters.accountId);
}

if (this.filters.type) {
  query.where('type', this.filters.type);
}

// check the query output by
console.log(query.toSQL().sql, query.toSQL().bindings);

Это возможно, потому что построитель запросов изменчив и аддитивен, так что вы можете добавить к нему еще несколько предложений и после инициализация.

Я почти уверен, что выше приведен код, который вы хотели написать, но я не знаю, приведет ли он к правильным результатам для вас:)

0 голосов
/ 07 марта 2020

Проблема в , где после from(PageModel.tableName). Вы создаете что-то вроде:

select x from foo where foo.z join bar.y

Чтобы создать запрос, присоединитесь правильным образом:

select * from users join account where (users.account=account.id)

С Knwex это

knex('users').join('account').where((builder) => builder.where('user.account','account.id'))

Вы можете проверить свой запрос здесь http://michaelavila.com/knex-querylab/

Проверьте это http://knexjs.org/#Builder - где и http://knexjs.org/#Builder -innerJoin

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...