不要怂,就是干,撸起袖子干!

Commit 196a381d by Yoni Jah Committed by Sushant

docs(upgrade-v4): instruction for include and required (#9048)

1 parent e92dc6f5
Showing with 48 additions and 35 deletions
...@@ -115,59 +115,72 @@ Sequelize V4 is a major release and it introduces new features and breaking chan ...@@ -115,59 +115,72 @@ Sequelize V4 is a major release and it introduces new features and breaking chan
- Raw options for where, order and group like `where: { $raw: '..', order: [{ raw: '..' }], group: [{ raw: '..' }] }` have been removed to prevent SQL injection attacks. - Raw options for where, order and group like `where: { $raw: '..', order: [{ raw: '..' }], group: [{ raw: '..' }] }` have been removed to prevent SQL injection attacks.
- `Sequelize.Utils` is not longer part of the public API, use it at your own risk - `Sequelize.Utils` is not longer part of the public API, use it at your own risk
- `Hooks` should return Promises now. Callbacks are deprecated. - `Hooks` should return Promises now. Callbacks are deprecated.
- `include` is always an array - `required` inside include does not propagate up the include chain.
To get v3 compatible results you'll need to either set `required` on the containing include.
Previous: Previous:
```js ```js
User.findAll({ user.findOne({
include: { include: {
model: Comment, model: project,
as: 'comments' include: {
model: task,
required: true
}
} }
}) });
```
New:
```js
User.findAll({
include: [{
model: Comment,
as: 'comments'
}]
})
``` ```
- `where` clause inside `include` does not make this `include` and all its parents `required`. You can use following `beforeFind` global hook to keep previous behaviour: New:
```js ```js
function whereRequiredLikeInV3(modelDescriptor) { User.findOne({
if (!modelDescriptor.include) { include: {
return false; model: Project,
required: true,
include: {
model: Task,
required: true
}
} }
});
return modelDescriptor.include.some(relatedModelDescriptor => { User.findOne({
const childDescriptorRequired = whereRequiredLikeInV3( include: {
relatedModelDescriptor, model: Project,
); required: true,
include: {
if ( model: Task,
(relatedModelDescriptor.where || childDescriptorRequired) && where: {type: 'important'} //where cause required to default to true
typeof relatedModelDescriptor.required === 'undefined'
) {
relatedModelDescriptor.required = true;
} }
}
});
```
return relatedModelDescriptor.required; Optionally you can add a `beforeFind` hook to get v3 compatible behavior -
}); ```js
function propagateRequired(modelDescriptor) {
let include = modelDescriptor.include;
if (!include) return false;
if (!Array.isArray(include)) include = [include];
return include.reduce((isRequired, descriptor) => {
const hasRequiredChild = propogateRequired(descriptor);
if ((descriptor.where || hasRequiredChild) && descriptor.required === undefined) {
descriptor.required = true;
}
return descriptor.required || isRequired;
}, false);
} }
const sequelize = new Sequelize(..., { const sequelize = new Sequelize(..., {
..., ...,
define: { define: {
hooks: { hooks: {
beforeFind: whereRequiredLikeInV3, beforeFind: propagateRequired
}, }
}, }
}); });
``` ```
......
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!