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

Commit 196a381d by Yoni Jah Committed by Sushant

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

1 parent e92dc6f5
Showing with 45 additions and 32 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: {
model: project,
include: { include: {
model: Comment, model: task,
as: 'comments' required: true
}
} }
}) });
``` ```
New: New:
```js ```js
User.findAll({ User.findOne({
include: [{ include: {
model: Comment, model: Project,
as: 'comments' required: true,
}] include: {
}) model: Task,
``` required: true
}
}
});
- `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: User.findOne({
include: {
model: Project,
required: true,
include: {
model: Task,
where: {type: 'important'} //where cause required to default to true
}
}
});
```
Optionally you can add a `beforeFind` hook to get v3 compatible behavior -
```js ```js
function whereRequiredLikeInV3(modelDescriptor) { function propagateRequired(modelDescriptor) {
if (!modelDescriptor.include) { let include = modelDescriptor.include;
return false;
}
return modelDescriptor.include.some(relatedModelDescriptor => { if (!include) return false;
const childDescriptorRequired = whereRequiredLikeInV3( if (!Array.isArray(include)) include = [include];
relatedModelDescriptor,
);
if ( return include.reduce((isRequired, descriptor) => {
(relatedModelDescriptor.where || childDescriptorRequired) && const hasRequiredChild = propogateRequired(descriptor);
typeof relatedModelDescriptor.required === 'undefined' if ((descriptor.where || hasRequiredChild) && descriptor.required === undefined) {
) { descriptor.required = true;
relatedModelDescriptor.required = true;
} }
return descriptor.required || isRequired;
return relatedModelDescriptor.required; }, 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!