I appreciate you bearing with this. :)
Unfortunately, no, it's definitely coming from these two. I still get the error if I reduce my model to just these three components (user, channel, role). And it goes away if I switch to User.BelongsToMany(channel) and Channel.BelongsToMany(user), both "through" the role model. (Sorry for the confusion about that - I do see that in the docs now. It's just that there are two "Associations" pages and only the Documentation-section entry makes this clear.)
BelongsToMany is almost an answer, actually. It's just that if you want the result of LEFT JOINs, you want to be able to do the equivalent of
User.findOne({ where: { id: 1 }, include: { model: Role, include: { model: Channel }}});
With two hasMany relationships from User and Channel to Role, and Role.belongsTo(User) / Role.belongsTo(Channel), this works great in either direction. You get your user, it includes an array of that user's roles, and each role includes that role's channel's fields.
If you switch to BelongsToMany, though, you get an error if you try to directly include Role in the query, because Role is no longer directly related to User. You CAN do this:
User.findOne({ where: { id: 1 }, include: { model: Channel }});
This is admittedly shorter and easier to read... but it's harder to code around the result because you pay the price of what you saved here in the iterations across the results. The preference is to let the database do its job and return as close to the final result as possible...
Is there a workaround that allows this? The goal is to allow an eager-loading query between three tables, A, B, and C, where A.belongsToMany(C, through: B), and C.belongsToMany(A, through: B). The desired result is an A record that contains an array of B records, each of which includes the appropriate C record.
If not, any idea how long this deprecation will last? If it's going to be there for years then it's no big deal. I'm only worried about support for it going away in the next few months.