Aquí está la consulta en la que estoy trabajando:

  return knex('table')
    .returning('id')
    .where('boolean', false)
    .andWhere('fooID', foo.id)
    .update({
      boolean : true
    })
    .limit(num)
    .then(function(ids) {
      console.log('\nids');
      console.log(ids); //outputs num

ids ahora contiene 3, que es el número de filas afectadas. ¿Hay alguna forma de obtener los identificadores de esas 3 filas? Tenía la impresión de que .returning() hizo eso, pero parece que no.

2
ahota 11 ene. 2017 a las 22:01

1 respuesta

La mejor respuesta

La base de datos Mysql no admite la instrucción returning y solo devuelve el recuento de filas actualizadas http://dev.mysql.com/doc/refman/5.7/en/update.html.

En su caso, parece que primero debe consultar los identificadores de las filas que se actualizarán y luego actualizarlas y recuperarlas dentro de una transacción.

Así:

return knex.transaction(trx => {
  return trx('table')
    .select('id')
    .where('boolean', false)
    .andWhere('fooID', foo.id)
    .limit(num)
    .then(ids => {
      return trx('table').update({ boolean: true })
        .whereIn('id', ids)
        .then(() => {
          return trx('table').whereIn('id', ids);
        });
    });
});
7
Mikael Lepistö 12 ene. 2017 a las 19:18
Gran respuesta. No pude encontrar esta información en ningún lado.
 – 
Felipe Costa
21 jun. 2018 a las 16:33