Вставить дополнительные данные в таблицу соединений - PullRequest
0 голосов
/ 09 мая 2018

Я создаю приложение с помощью Express, и я использую книжную полку (mysql) js в качестве ORM. У меня есть отношение многие ко многим, и я пытаюсь сохранить в соединительной таблице некоторые дополнительные данные.

Мои модели:

const Product = Bookshelf.Model.extend({
    tableName: 'products',
    factors() {
        return this.belongsToMany('Factor', 'product_factors', 'product_id', 'factor_id')
    }
}) 


const Factor = Bookshelf.Model.extend({
    tableName: 'factors',
    products() {
        return this.belongsToMany('Product')
    }

})

Создание нового продукта со связями в таблице product_factors.

    /** Create product */
    router.route('/').post((req, res) => {
        new Product({name: req.body.name})
            .save()
            .then(product => {
            // attaching relation
                product.factors().attach([3, 5])
                    .then(hz => {
                        res.status(201).json({
                            message: 'Product created'
                        })
                    })
            })

    })

Таблица «product_factors»

|ID|product_id|factor_id|quantity|
|--|----------|---------|--------|
|1 |10        |3        |NULL    |
|2 |10        |5        |NULL    |

Как я могу вставить количество одновременно с прикрепленными отношениями?

1 Ответ

0 голосов
/ 09 мая 2018

В документации есть пример того, как это сделать в разделе model.belongsToMany() . Для удобства вот оно:

let Doctor = bookshelf.Model.extend({
  patients: function() {
    return this.belongsToMany(Patient).through(Appointment);
  }
});

let Appointment = bookshelf.Model.extend({
  patient: function() {
    return this.belongsTo(Patient);
  },
  doctor: function() {
    return this.belongsTo(Doctor);
  }
});

let Patient = bookshelf.Model.extend({
  doctors: function() {
    return this.belongsToMany(Doctor).through(Appointment);
  }
});

Как видно из моделей Doctor и Patient, вы должны использовать .belongsToMany(Model).through(AnotherModel). Тогда нужно просто использовать методы attach(), detach(), updatePivot() и withPivot() по мере необходимости обрабатывать данные.

Кроме того, поскольку вы определяете модель соединения, вы также можете использовать ее напрямую для доступа и изменения данных, содержащихся в связанной таблице. Например:

Appointment.forge({patient_id: 2, doctor_id: 1, confirmed: true}).save()

или

Appointment.forge({id: 4}).destroy()
...