markdown 通过params.include.sequelize dan membuat field dengan数据类型包括关联di Sequelize dalam lingkungan fe

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了markdown 通过params.include.sequelize dan membuat field dengan数据类型包括关联di Sequelize dalam lingkungan fe相关的知识,希望对你有一定的参考价值。

# Include Sequelize Associated Models data via params di Feathersjs dan field dengan data type Virtual

Contoh kasus untuk dua model yang memiliki asosiasi dalam sebuah aplikasi feathersjs yang menggunakan Sequelize sebagai Database Driver. Melalui hook yang melakukan modifikasi terhadap `params` yang berada di dalam `context`, asosiasi dapat ditampilkan ketika melakukan query terhadap service yang menggunakan models terkait.

## Nested result didalam find() dan get(id)

Hasil awal misalkan
```json
data: [{
  "id": 1,
  "email": "user@email.address",
  "userProfileId": 1
}]
```
`userProfilesId` merupakan foreign_key ke model `user_profiles` dengan model asosiasi one to one relationship.
Hasil yang diinginkan
```json
data: [{
  "id": 1,
  "email": "user@email.address",
  "userProfileId": 1,
  "userProfile": {
    "fullName" : "First Last Name", // virtual
    "birthDate": "29-03-1992",
    "address": "Address"
  }
}]
```

## Asosiasi model

Asosiasi kedua model dapat dilakukan melalui `belongsTo()` di `users` model yang akan menambahkan field foreign key `userProfileId` di dalam model tersebut.

``` javascript
# src/models/users.model.js
  // eslint-disable-next-line no-unused-vars
  models.associate = function (models) {
    // Define associations here
    // See http://docs.sequelizejs.com/en/latest/docs/associations/
    users.belongsTo(models.userProfiles, {as: 'userProfile'});
  };
```

## Hook untuk menambahkan params include

Generade hooks yang dijalankan pada tahapan `before` untuk query di service terkait, contoh nama hook adalah `populate-users`

``` javascript
# src/hooks/populate-users.js
module.exports = function (options = {}) {
  return async context => {
    const users = context.app.services.users.Model;
    context.params.sequelize = {
      raw:false, 
      include: [
        {
          model: userProfiles,
          as: 'userProfile',
          attributes: ['fullname','birthdate', 'address']
        }
      ]
    };
    return context;
  };
};
```
Penambahan `context.params.sequelize.include` yang berisikan array terhadap model yang terasosiasi dengan model terkait akan melakukan query terpisah terhadap associated model tersebut untuk kemudian menambahkan object dari model yang terasosiasi ke dalam context.result yang ditampilkan ke user.
ref: https://github.com/feathersjs-ecosystem/feathers-sequelize#setting-paramssequelizeinclude

## raw:false

Secara default, operasi yang dilakukan dalam lingkungan feathersjs memiliki option `raw:true` yang menyebabkan beberapa hal berikut;
via https://github.com/feathersjs-ecosystem/feathers-sequelize#sequelize-raw-queries
- Getters/Setters custom akan diabaikan
- Associated Data akan ditampilkan dengan sedikit berbeda
- Validasi pada tingkatan model akan diabaikan
Dengan kelebihan kecepatan proses yang dapat diperoleh dengan menggunakan opsi ini.
Namun demikian hal sebagai berikut akan diabaikan;

```javascript
# userProfiles model file
fullName: {
  type: DataTypes.VIRTUAL
  get() {
    return this.firstName + ' ' + this.lastName;
  }
}
```
Untuk memungkinkan definisi field dengan data type virtual silahkan tambahkan opsi `raw:false` di tahapan before atau gunakan hook `hydrate`
https://github.com/feathersjs-ecosystem/feathers-sequelize#working-with-sequelize-model-instances

Hook terpisah untuk menonaktifkan `raw` result, misalkan dalam kasus ini ketika kita ingin memanggil model userProfiles secara langsung.

```javascript
# file ./src/hooks/raw-false.js

module.exports = function (options = {}) {
  return async context => {
    if (!context.params.sequelize) context.params.sequelize = {};
    Object.assign(context.params.sequelize, { raw: false });
    return context;
  };
};
```

以上是关于markdown 通过params.include.sequelize dan membuat field dengan数据类型包括关联di Sequelize dalam lingkungan fe的主要内容,如果未能解决你的问题,请参考以下文章

markdown基础使用技巧

Gulp Front Matter + Markdown 通过 Nunjucks

markdown 通过Techno

markdown 通过ApplicationContext中获取豆

markdown 通过LXC / LXD运行Minikube

markdown 通过API Mapado实现活动