ããã«ã¡ã¯ã
ç§ã¯çŸåšãç§ãã¡ã®ããŒã ã®ããã«ãã§ã¶ãŒãè©äŸ¡ããŠããŠãããã倧奜ãã§ãã ç§ã¯ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããããšããŠããŸãããå€å¯Ÿå€ã®é¢ä¿ãæã€ãšã³ãã£ãã£éã®é¢é£ä»ãã®äœæãŸãã¯æŽæ°ãåŠçããæ¹æ³ã«å°æããŠããŸãã
mããnãžã®ãªã¬ãŒã·ã§ã³ã·ãããã§ã¶ãŒã®äŸã®ä¿åãšæŽæ°ããªã¯ãšã¹ãããããšæããŸãã
ã·ããªãªïŒ
/ playersãš/ teamsã®2ã€ã®ãµãŒãã¹ããããŸãïŒãããã¯ç§ãèããä»»æã®ãªãœãŒã¹ã§ãïŒã ãã¬ãŒã€ãŒã¯å€ãã®ããŒã ã«å±ããŠããå¯èœæ§ããããããŒã ã«ã¯å€ãã®ãã¬ãŒã€ãŒãããŸãã ãã¬ãŒã€ãŒãšããŒã ããšã¬ã¬ã³ãã«é¢é£ä»ããæ¹æ³ãããããŸããã
次ã®æ¹æ³ãç解ãããã®ã§ããã
ç§ã¯é¢é£ä»ããããŸãèšå®ããããšãã§ããŸãïŒ
team.model.js
...
team.associate = function (models) {
team.belongsToMany(models.player, {through: 'PlayerTeam'});
};
...
player.model.js
...
player.associate = function (models) {
player.belongsToMany(models.team, {through: 'PlayerTeam'});
};
...
ã«ã€ã«-ããã¯ãã®ããã«è§£æ±ºããŸããïŒ ïŒäŸïŒ
ããããšãããããŸããã
ããŒã¯ã»ãšãã¯ãŒãº
3æ44åPMã®æšã2018幎4æ5æ¥ã«ã¯ãã«ã€ã«ã»ã³ãŒãã©ã³ã[email protected]
æžããŸããïŒ
ããã«ã¡ã¯ã
ç§ã¯çŸåšãç§ãã¡ã®ããŒã ã®ããã«ãã§ã¶ãŒãè©äŸ¡ããŠããŠãããã倧奜ãã§ãã ç§ã¯ããããšããŠããŸã
ç§ãã¡ã®ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ãã«ããŒããäœæãŸãã¯äœæãåŠçããæ¹æ³ã«å°æããŠããŸã
å€å¯Ÿå€ã®é¢ä¿ãæã€ãšã³ãã£ãã£éã®é¢é£ä»ããæŽæ°ããŸããmããnã®ãªã¬ãŒã·ã§ã³ã·ãããã§ã¶ãŒã®ä¿åãšæŽæ°ããªã¯ãšã¹ãããã
äŸãã·ããªãªïŒ
/ playersãš/ teamsã®2ã€ã®ãµãŒãã¹ããããŸãïŒãããã¯ä»»æã®ãªãœãŒã¹ã§ãïŒ
ç§ã¯èããŸããïŒã ãã¬ãŒã€ãŒã¯å€ãã®ããŒã ã«å±ããŠããå¯èœæ§ããããããŒã ã«ã¯å€ãã®ããŒã ããããŸã
ãã¬ã€ã€ãŒã ãã¬ãŒã€ãŒãšããŒã ã®é¢é£ä»ããåŠçããæ¹æ³ãããããŸãã
ãšã¬ã¬ã³ããªãã¡ãã·ã§ã³ã次ã®æ¹æ³ãç解ãããã®ã§ããã
- ããŒã ã«ãã¬ãŒã€ãŒãè¿œå ãã
- ããŒã ãããã¬ãŒã€ãŒãåé€ãã
ç§ã¯é¢é£ä»ããããŸãèšå®ããããšãã§ããŸãïŒ
team.model.js..ã
team.associate = functionïŒmodelsïŒ{
team.belongsToManyïŒmodels.playerã{throughïŒ 'PlayerTeam'}ïŒ;
};
..ãplayer.model.js
..ã
player.associate = functionïŒmodelsïŒ{
player.belongsToManyïŒmodels.teamã{throughïŒ 'PlayerTeam'}ïŒ;
};
..ãâ
ãã®ã¹ã¬ããã«ãµãã¹ã¯ã©ã€ãããŠããããããããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/feathersjs/feathers/issues/852 ããŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ACyd4jo95mdpY5gNYF3GtdghdDwfwG4Uks5tlp40gaJpZM4TJRE4
ã
@edwardsmarkfããŒã¯ãããã
ããã«ã¡ã¯ã«ã€ã«-ç»åã¯ãââãããæ¥ãŸããïŒ
https://en.wikipedia.org/wiki/Many-to-many_ïŒdata_modelïŒ-å€å
githubã¡ãŒã«ã¯åçãèš±å¯ããŠããŸãããïŒ
ç§ã¯ããªããæ£ããç解ãããšæããŸãã
ããããšãããããŸããã
ããŒã¯ã»ãšãã¯ãŒãº
5æ51åPMã«æšã2018幎4æ5æ¥ã«ã¯ãã«ã€ã«ã»ã³ãŒãã©ã³ã[email protected]
æžããŸããïŒ
@edwardsmarkf https://github.com/edwardsmarkfããããŒã¯ãããããšã
æãå·®ã䌞ã¹ãã ããªãã®äŸã¯çç¥ãããŠãããããããªããšæããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/feathersjs/feathers/issues/852#issuecomment-379118164 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ACyd4gMY3kJiprvR3I2fRZP7LThfbvLHks5tlrwDgaJpZM4TJRE4
ã
èšåããã®ãå¿ããïŒ
https://en.wikipedia.org/wiki/Many-to-many_ïŒdata_model ïŒïŒ
èè
ãšæ¬ã®å€å¯Ÿå€ã®é¢ä¿ã1察å€ã®ãã¢ãšããŠ
ãžã£ã³ã¯ã·ã§ã³ããŒãã«ãšã®é¢ä¿
ããªãã®é¢ä¿ã¯ãããã®éã®ããžã£ã³ã¯ã·ã§ã³ããŒãã«ããåŸãããšãã§ããŸããïŒ ãžã£ã³ã¯ã·ã§ã³
ããŒãã«ã¯ã³ã¡ã³ããæ¥ä»ãªã©ãèããã ãã§ä¿æã§ãããããããŸããã
ããããšãããããŸããã
ããŒã¯ã»ãšãã¯ãŒãº
2018幎4æ5æ¥æšææ¥ååŸ6æ4åãMark
>>
ããã«ã¡ã¯ã«ã€ã«-ç»åã¯ãââãããæ¥ãŸããïŒ https ïŒ
/ Many-to-many_ïŒdata_modelïŒ-ããããgithubã¡ãŒã«ã§ã¯èš±å¯ãããŠããŸãã
åçïŒç§ã¯ããªããæ£ããç解ãããšæããŸãã
ããããšãããããŸããã
ããŒã¯ã»ãšãã¯ãŒãº
5æ51åPMã«æšã2018幎4æ5æ¥ã«ã¯ãã«ã€ã«ã»ã³ãŒãã©ã³ã[email protected]
æžããŸããïŒ@edwardsmarkf https://github.com/edwardsmarkfããããŒã¯ãããããšã
æãå·®ã䌞ã¹ãã ããªãã®äŸã¯çç¥ãããŠãããããããªããšæããŸããâ
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/feathersjs/feathers/issues/852#issuecomment-379118164 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ACyd4gMY3kJiprvR3I2fRZP7LThfbvLHks5tlrwDgaJpZM4TJRE4
ã
ã¡ãã£ãšãšãã¯ãŒããããããšãã ORM /ãã§ã¶ãŒã䜿çšãããžã£ã³ã¯ã·ã§ã³ããŒãã«ã®åŠçãåœé¢ã®åé¡ã§ãã
ãããç§ã®æåã®æšæž¬ãšSequelizeã®åé¡ã解決ããæ¹æ³ã§ãã ã¿ãªããã®ãæèŠããèãããã ããã
app.use('/team/:teamId/player/:playerId', {
// Gives the ability to add the association
create(data, params) {
return app.service('team').Model.findById(params.route.teamId).then(team => {
return app.service('player').Model.findById(params.route.playerId).then(player => {
return team.addPlayer(player);
});
});
},
// Gives the ability to delete an association
remove(id, params) {
return app.service('team').Model.findById(params.route.teamId).then(team => {
return app.service('player').Model.findById(params.route.playerId).then(player => {
return team.removePlayer(player);
});
});
}
});
ããã¯https://sequelize.slack.comã§ãã£ãšããçããããã®ã ãããïŒ ãŸãã¯ä»£ããã«ãã¥ãŒã䜿çšããŸããïŒ
äœãæåã ãšå€æãããã«ã€ããŠãç§ã«ç¥ãããŠãã ããã ããã¯éåžžã«èå³æ·±ãåé¡ã§ãã
ããªããææ¡ããŠãããã®ãµãŒãã¹ã¯å®éã«ã¯ããªããã¡ããšããŠããŸãã ãŸããçµåããŒãã«ã¢ãã«çšã«å¥ã®ãµãŒãã¹ãäœæããããšããããŸãã @DesignByOnyxã¯ã圌ã®æ è¡ããããã«äœãæŽå¯ãæã£ãŠããã®ã ãããã
æ°ããé¢é£ãšã³ããªã®äœæã¯ãé
åãcreate
æž¡ãããšã§æ©èœããã¯ãã§ãããæ£ããã§ããïŒ
ã¿ãªããããã®è¿ä¿¡ããããšãããããŸãã @dafflã®ææ¡ã§ãããããŒã ãã¬ãŒã€ãŒã®ãµãŒãã¹ãå©çšããŠãããã¯ãä»ããŠãšã³ããªãçµåããããšã«ãªããŸããïŒ ãŸããé åãä»ããŠæ°ããé¢é£ãšã³ããªãäœæããããšã®æå³ã説æããŠããããŸããïŒ
ããã®@dafflã¯ããµãŒãã¹å¯ŸORMã§ã®ç§ã®æè¯ã®æšæž¬ã§ã
ãµãŒãã¹æåã®æ¹æ³ïŒ
//AFTER HOOK: pseudo-code I haven't tested this
const {result, app} = context;
result.map(async team => {
const players = await app.service('team-player').find({
query: {
teamId: team.id
}
}).then(results => {
return app.service('player').find({
query: {
playerId: results.playerId
});
});
team.players = players;
})
return context;
ORMã®æ¹æ³ïŒ
`` `
//ããã¯åïŒããã¯æ©èœããŸã
context.params.sequelize = {
å«ãïŒ [ {
ã¢ãã«ïŒcontext.app.serviceïŒ 'player'ïŒãModelã
ãšããŠïŒ 'ãã¬ãŒã€ãŒ'ã
å±æ§ïŒ['åå']ã
䜿ã£ãŠïŒ {
å±æ§ïŒ[]
}
}]ã
çïŒfalse
};
ã³ã³ããã¹ããè¿ããŸãã
ã«ã€ã«-ç§ã¯ããªããçŽé¢ããŠããã®ãšåãåé¡ã«ééããããšããŠããã®ã§ããé¡ãããŸã
ãããã©ã®ããã«æ©èœããããæããŠãã ããã
ããããšãããããŸããã
ããŒã¯ã»ãšãã¯ãŒãº
11:22æéã2018幎4æ6æ¥ã«ã¯ãã«ã€ã«ã»ã³ãŒãã©ã³ã[email protected]
æžããŸããïŒ
@dafflhttps ïŒ//github.com/dafflããã«ãµãŒãã¹ãšORMã®ç§ã®æè¯ã®æšæž¬ããããŸã
ãµãŒãã¹æåã®æ¹æ³ïŒ
//ããã¯åŸïŒç䌌ã³ãŒãããã¯ãã¹ãããŠããŸãã
const {resultãapp} =ã³ã³ããã¹ã;
result.mapïŒasync team => {
constplayers = await app.serviceïŒ 'team-player'ïŒãfindïŒ{
ã¯ãšãªïŒ{
teamIdïŒteam.id
}
}ïŒãthenïŒresults => {
app.serviceïŒ 'player'ïŒãfindïŒ{
ã¯ãšãªïŒ{
playerIdïŒresults.playerId
}ïŒ;
}ïŒ;team.players =ãã¬ãŒã€ãŒ;
}ïŒã³ã³ããã¹ããè¿ããŸãã
ORMã®æ¹æ³ïŒ
//ããã¯åïŒããã¯æ©èœããŸã
context.params.sequelize = {
å«ãïŒ [ {
ã¢ãã«ïŒcontext.app.serviceïŒ 'player'ïŒãModelã
ãšããŠïŒ 'ãã¬ãŒã€ãŒ'ã
å±æ§ïŒ['åå']ã
䜿ã£ãŠïŒ {
å±æ§ïŒ[]
}
}]ã
çïŒfalse
};ã³ã³ããã¹ããè¿ããŸãã
â
ããªããèšåãããã®ã§ããªãã¯ãããåãåã£ãŠããŸãã
ãã®ã¡ãŒã«ã«çŽæ¥è¿ä¿¡ããGitHubã§è¡šç€ºããŠãã ãã
https://github.com/feathersjs/feathers/issues/852#issuecomment-379336187 ã
ãŸãã¯ã¹ã¬ããããã¥ãŒãããŸã
https://github.com/notifications/unsubscribe-auth/ACyd4hzQdRSLJ5tBm7I_BkOFPDYkyhU7ks5tl7JKgaJpZM4TJRE4
ã
n:m
é¢ä¿ã¯ãCRUDæäœå
šäœã§èª¿æŽããã®ã«æãé£ããé¢ä¿ã§ãã ç§ã¯ãã€ããããã°æçš¿ããšãã¿ã°ããç§ã®å€å
žçãªn:m
äŸã§äœ¿çšããŠããŸãã èæ
®ããªããã°ãªããªã3ã€ã®ç°ãªãã·ããªãªããããŸãã
#3
ã¯ã¯ããã«è€éã§ãã ãã ãããã®ã·ããªãªã解決ããããšã§ãæåã®2ã€ãç¡æã§è§£æ±ºã§ããŸãã ãããç§ãããã«ã¢ãããŒãããæ¹æ³ã§ãïŒ
js
{
id: 123,
title: 'My first blog post',
body: '...',
tags: [
{ id: 111, text: 'tag-1' },
{ id: 222, text: 'tag-2' },
{ text: 'new-tag' } // new tags will not have an "id"
]
}
js
(context) => {
if (context.data.tags) {
context._tag_data = context.data.tags;
delete context.data.tags;
}
return context;
}
js
async (context) => {
const tags = context._tag_data;
if (tags && tags.length) {
// tags without an "id" are considered new
const existingTags = tags.filter(t => t.hasOwnProperty('id'));
const newTags = tags.filter(t => !t.hasOwnProperty('id'));
await tagService.create(newTags).then(createdTags => {
// update the context._tag_data to contain the existing and newly created tags
context._tag_data = existingTags.concat(createdTags)
})
}
return context;
}
js
async (context) => {
const tags = context._tag_data;
if (tags && tags.length) {
const blogPostId = hook.result.id;
const mappings = tags.map(t => ({ tagId: t.id, blogPostId }));
await postTagsService.create(mappings).then(() => {
// Put the tags on the final result
hook.result.tags = tags;
});
}
return context;
}
ããã¯_ç°¡å_ã§ã¯ãªãããã«æããŸãããç§ã¯ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠèããããšã«å€ãã®æéãè²»ãããŸãããäžèšã¯ãå šäœçãªãŠãŒã¶ãŒãã¬ã³ããªãŒãªãœãªã¥ãŒã·ã§ã³ã«ã€ããŠç§ãèŠãå¯äžã®æ¹æ³ã§ãã ç§ã¯ææ¡ãæ±ããŠããŸãããåäžã®æäœã§ããŒã¿ãäœæããŠé¢é£ä»ããããšãå¯èœã«ãã確ç«ããããŠãŒã¶ããªãã£èŠåïŒWordpressãStackOverflowãªã©ïŒã«å¯ŸåŠããå¿ èŠããããŸãã
ãŸããSequelizeã䜿çšãããšããããå¿ èŠä»¥äžã«é£ãããªããšæããŸãã ã¢ãã«ã¡ãœããã¯éçºè ãšããŠçŽæçã«èŠããŸãããAPIã¯ã©ã€ã¢ã³ãã®èŠ³ç¹ããã¯ãã¡ãœãããåŒã³åºãã®ã§ã¯ãªããããŒã¿ãéä¿¡ããã ãã§ãã
ããšãã°ãæ¢åã®IDã䜿çšããããIDã®ãªã¹ããæå®ãããããŠãé¢é£ä»ããæŽæ°ãŸãã¯äœæããããšã¯ã§ããŸãããããã¯éåžžã«çŽæçã§ã¯ãããŸããã
ç§ã¯ãããšåãåé¡ãæ±ããŠããŸããã䜿ããããå®å šãªãã®ã¯èŠã€ãããŸããã§ããã
ããã§ãåãåé¡ããããŸãã @ DesignByOnyxãä»ã®ãšãããã®ã¢ãããŒããæ¡çšããããšã«æè¬ããŸãã ä»ã®èª°ããããã«å¯ŸããçŽæçãªè§£æ±ºçãæãä»ããŸããïŒ
ç§ãããããã©ããŒããŠããŠãçŸåšãä»é±æ°ãããããžã§ã¯ãã«ãããå®è£ ããããšããŠããŸã
@dafflææ¡ãããããšããããã¯ä»ã®ãšããç§ã®ããã«åããã
ã¡ãã£ãšããã¡ã¢ãšããŠãå®éã«ã¯@DesignByOnyxã瀺ãããã
æ¬ ç¹ã¯ãæŽæ°ã®ãã³ã«ããªãã®äžèŠãªäœæ¥ãè¡ãããšã§ãïŒå€æŽãããŠããªãå¯èœæ§ã®ããã¿ã°ã®ãªã¹ããåé€ããŠä¿åããŸãïŒã
ç§ãèããããšãã§ããå¯äžã®éžæè¢ã¯ãæŽæ°ããåã«é¢ä¿ãèªã¿åããå¿ èŠãª[äœæãæŽæ°ãåé€]ã®æå°æ°ãèšç®ããããšã§ãã ã¿ã°ã®æ°ãå€ãå Žåã¯ãããã ãã®äŸ¡å€ããããããããŸããã
å¥ã®ã¢ã€ãã¢ã¯ãé¢ä¿ã®ãµãŒãã¹ãäœæããIDã§åãšã³ããªãèå¥ãã[æçš¿ãã¿ã°]ã®ãã¢ããšã«åå¥ã«åŒã³åºãããšã ãšæããŸãã ããã¯ãããã¯ãŒã¯ãªã¯ãšã¹ãã§ã¯éå¹çã«æããŸãããæŠå¿µçã«ã¯ãã¹ãŠãäžåºŠã«å®è¡ãããããå°ãç°¡åã§ãã
class CustomService {
constructor(options) {
this.options = options || {};
}
/**
* <strong i="5">@params</strong> {object} data - Sent in from client
* <strong i="6">@params</strong> {INT} data.building_id - ID of the building from the Building Model
* <strong i="7">@params</strong> {INT} data.contact_id - ID of the contact from the Contact Model
*/
create = async (data, params) => {
if (isNaN(data.building_id)) {
throw new errors.BadRequest('Building ID MUST be a Number', data);
}
if (isNaN(data.contact_id)) {
throw new errors.BadRequest('Contact ID MUST be a Number', data);
}
const building = await this.options.building.get(data.building_id);
const contact = await this.options.contact.get(data.contact_id);
const buildingContacts = await building.addContact(contact);
return buildingContacts;
};
}
export default app => {
app.use(
'api/v1/building_contacts',
new CustomService({
building: app.service('api/v1/building'),
contact: app.service('api/v1/contact')
})
);
const buildingContactsService = app.service('api/v1/building_contacts');
buildingContactsService.hooks(hooks);
};
ç§ãçŽé¢ããŠããåé¡ã¯ãé£çµ¡å
ã建ç©ã«ãã§ã«ååšããå ŽåãéµäŸ¿é
éå¡ã«page not found
ãšã©ãŒãçºçããããšã§ãã
é£çµ¡å
ã建ç©ã«è¿œå ãããããšããªãå Žåãããã¯åé¡ãªãå®è¡ãããŸãã
äœãæ¡ã¯ïŒ
const tags = context._tag_data; if (tags && tags.length) { const blogPostId = hook.result.id; const mappings = tags.map(t => ({ tagId: t.id, blogPostId })); await postTagsService.create(mappings).then(() => { // Put the tags on the final result hook.result.tags = tags; }); }
ããã¯ãäžéããŒãã«çšã®ãã§ã¶ãŒãµãŒãã¹ãäœæããå¿ èŠãããããšãæå³ããŸããïŒ äžèŠãªãµãŒãã¹ã®ããã§ãã ããã§ããŒã¿ããŒã¹ãšå¯Ÿè©±ããå¥ã®æ¹æ³ã¯ãããŸããïŒ
ãé¢ä¿ããµãŒãã¹ãå¿
èŠã§ããã3çªç®ã®ãµãŒãã¹ãšããŠã®äœ¿çšãåé¿ããããã«ç§ãè¡ã£ããã¹ãŠã®è©Šã¿ã¯ãç¡é§ã§ããããä»ã®ã³ãŒããäžåœã«å°é£ã«ããŸããã ããã¯ç§ãn:m
é¢ä¿ãæ±ã£ããšãã«æã£ãŠããæ倧ã®ããã¯ã¯ãã®ç¬é
ãã®ã·ããªãªã«ã€ããŠèããŠã¿ãŠãã ãããããã°æçš¿ãšæ¢åã®ã¿ã°ãããã2ã€ãé¢é£ä»ããããšèããŠããŸãã ããã°æçš¿èªäœãäœæãŸãã¯æŽæ°ããã®ã§ã¯ãªããã¿ã°ãäœæãŸãã¯æŽæ°ããã®ã§ããããŸãããåã«2ã€ã®éã®é¢ä¿ãå®çŸ©ããã ãã§ãã ããã°ãµãŒãã¹ãã¿ã°ãµãŒãã¹ã«è§Šããå¿ èŠã¯ãããŸããããblog-tagsããµãŒãã¹ã ãã«è§Šããå¿ èŠããããŸã...ãã®ããã«ã¯ååšããå¿ èŠããããŸãã
ãã1ã€ã®ïŒããè€éãªïŒãªãã·ã§ã³ã¯ãããã°ãµãŒãã¹ãŸãã¯ã¿ã°ãµãŒãã¹ã䜿çšããŠé¢ä¿ãæŽæ°ããããšããããšã§ãã ã©ã¡ãã䜿ããŸããïŒ ãããããŒã ã«ã©ã®ããã«äŒããŸããïŒ ãããäž¡æ¹ã®æ¹æ³ã§çºçããããšãèš±å¯ãããšãç¶æããã³ãŒãã2åã«ãªããã¡ã³ã¿ã«ã¢ãã«ãé£ãããªããŸãã é¢ä¿èªäœã«3çªç®ã®ãµãŒãã¹ãããå Žåããããã®åé¡ã¯ãã¹ãŠè§£æ¶ãããŸãã
æãåèã«ãªãã³ã¡ã³ã
n:m
é¢ä¿ã¯ãCRUDæäœå šäœã§èª¿æŽããã®ã«æãé£ããé¢ä¿ã§ãã ç§ã¯ãã€ããããã°æçš¿ããšãã¿ã°ããç§ã®å€å žçãªn:m
äŸã§äœ¿çšããŠããŸãã èæ ®ããªããã°ãªããªã3ã€ã®ç°ãªãã·ããªãªããããŸãã#3
ã¯ã¯ããã«è€éã§ãã ãã ãããã®ã·ããªãªã解決ããããšã§ãæåã®2ã€ãç¡æã§è§£æ±ºã§ããŸãã ãããç§ãããã«ã¢ãããŒãããæ¹æ³ã§ãïŒjs { id: 123, title: 'My first blog post', body: '...', tags: [ { id: 111, text: 'tag-1' }, { id: 222, text: 'tag-2' }, { text: 'new-tag' } // new tags will not have an "id" ] }
js (context) => { if (context.data.tags) { context._tag_data = context.data.tags; delete context.data.tags; } return context; }
js async (context) => { const tags = context._tag_data; if (tags && tags.length) { // tags without an "id" are considered new const existingTags = tags.filter(t => t.hasOwnProperty('id')); const newTags = tags.filter(t => !t.hasOwnProperty('id')); await tagService.create(newTags).then(createdTags => { // update the context._tag_data to contain the existing and newly created tags context._tag_data = existingTags.concat(createdTags) }) } return context; }
js async (context) => { const tags = context._tag_data; if (tags && tags.length) { const blogPostId = hook.result.id; const mappings = tags.map(t => ({ tagId: t.id, blogPostId })); await postTagsService.create(mappings).then(() => { // Put the tags on the final result hook.result.tags = tags; }); } return context; }
ããã¯_ç°¡å_ã§ã¯ãªãããã«æããŸãããç§ã¯ãã¹ãŠã®ãŠãŒã¹ã±ãŒã¹ã«ã€ããŠèããããšã«å€ãã®æéãè²»ãããŸãããäžèšã¯ãå šäœçãªãŠãŒã¶ãŒãã¬ã³ããªãŒãªãœãªã¥ãŒã·ã§ã³ã«ã€ããŠç§ãèŠãå¯äžã®æ¹æ³ã§ãã ç§ã¯ææ¡ãæ±ããŠããŸãããåäžã®æäœã§ããŒã¿ãäœæããŠé¢é£ä»ããããšãå¯èœã«ãã確ç«ããããŠãŒã¶ããªãã£èŠåïŒWordpressãStackOverflowãªã©ïŒã«å¯ŸåŠããå¿ èŠããããŸãã