2016-04-04 21:51:00 +02:00

2.4 KiB
Executable File

Raw

Sometimes you may need to use a raw expression in a query. Raw query object may be injected pretty much anywhere you want, and using proper bindings can ensure your values are escaped properly, preventing SQL-injection attacks.

Raw Parameter Binding

One can parameterize SQL given to strapi.connections.default.raw(sql, bindings). Parameters can be positional named. One can also choose if parameter should be treated as value or as SQL identifier e.g. in case of TableName.ColumnName reference.

strapi.connections.default('users')
  .select(strapi.connections.default.raw('count(*) as user_count, status'))
  .where(strapi.connections.default.raw(1))
  .orWhere(strapi.connections.default.raw('status <> ?', [1]))
  .groupBy('status')

Positional bindings ? is interpret as value and ?? as identifier:

strapi.connections.default('users')
  .where(strapi.connections.default.raw('?? = ?', ['user.name', 1]))

Named bindings :name is interpret as value and :name: as identifier:

strapi.connections.default('users')
  .where(strapi.connections.default.raw(':name: = :thisGuy or :name: = :otherGuy', {
    name: 'users.name',
    thisGuy: 'Bob',
    otherGuy: 'Jay'
  }))

For simpler queries where one only has a single binding, .raw can accept said binding as its second parameter :

strapi.connections.default('users')
  .where(
    strapi.connections.default.raw('LOWER("login") = ?', 'strapi')
  )
  .orWhere(
    strapi.connections.default.raw('accesslevel = ?', 1)
  )
  .orWhere(
    strapi.connections.default.raw('updtime = ?', new Date())
  )

Note that due to ambiguity, arrays must be passed as arguments within a containing array :

strapi.connections.default
  .raw('select * from users where id in (?)', [[1, 2, 3]])

To prevent replacement of ? one can use escape sequence \\?.

strapi.connections.default
  .select('*').from('users')
  .where('id', '=', 1)
  .whereRaw('?? \\? ?', ['jsonColumn', 'jsonKey'])

Raw expressions

Raw expressions are created by using strapi.connections.default.raw(sql, [bindings]) and passing this as a value for any value in the query chain.

strapi.connections.default('users')
  .select(strapi.connections.default.raw('count(*) as user_count, status'))
  .where(strapi.connections.default.raw(1))
  .orWhere(strapi.connections.default.raw('status <> ?', [1]))
  .groupBy('status')