diff --git a/packages/strapi-connector-bookshelf/lib/buildQuery.js b/packages/strapi-connector-bookshelf/lib/buildQuery.js index b7c8c6e986..d7ebb1a8aa 100644 --- a/packages/strapi-connector-bookshelf/lib/buildQuery.js +++ b/packages/strapi-connector-bookshelf/lib/buildQuery.js @@ -99,18 +99,20 @@ const buildJoinsAndFilter = (qb, model, whereClauses) => { ); } else if (assoc.nature === 'manyWay') { const joinTableAlias = generateAlias(assoc.tableCollectionName); + const isRelatedToSameTable = + destinationInfo.model.collectionName === originInfo.model.collectionName; qb.leftJoin( `${originInfo.model.databaseName}.${assoc.tableCollectionName} AS ${joinTableAlias}`, - `${joinTableAlias}.${singular(originInfo.alias)}_id`, + `${joinTableAlias}.${singular(originInfo.model.collectionName)}_id`, `${originInfo.alias}.${originInfo.model.primaryKey}` ); qb.leftJoin( `${destinationInfo.model.databaseName}.${destinationInfo.model.collectionName} AS ${destinationInfo.alias}`, - `${joinTableAlias}.${singular(originInfo.model.attributes[assoc.alias].attribute)}_${ - originInfo.model.attributes[assoc.alias].column - }`, + `${joinTableAlias}.${isRelatedToSameTable ? 'related_' : ''}${singular( + originInfo.model.attributes[assoc.alias].attribute + )}_${originInfo.model.attributes[assoc.alias].column}`, `${destinationInfo.alias}.${destinationInfo.model.primaryKey}` ); } else { diff --git a/packages/strapi/__tests__/deepFiltering.test.e2e.js b/packages/strapi/__tests__/deepFiltering.test.e2e.js index e320f761b0..61c1f14a33 100644 --- a/packages/strapi/__tests__/deepFiltering.test.e2e.js +++ b/packages/strapi/__tests__/deepFiltering.test.e2e.js @@ -33,6 +33,11 @@ const collector = { target: 'application::panini-card.panini-card', unique: false, }, + collector_friends: { + nature: 'manyWay', + target: '__self__', + unique: false, + }, }, }; @@ -72,6 +77,7 @@ async function createFixtures() { body: { name: 'Isabelle', panini_cards: [data.paniniCards[0].id], + collector_friends: [data.collectors[0].id], }, }); data.collectors.push(collector2Res.body); @@ -137,4 +143,22 @@ describe('Deep Filtering API', () => { expect(res.body[0]).toMatchObject(data.collectors[0]); }); }); + + describe('Filter on a self manyWay relation', () => { + test('Should return 1 result', async () => { + const res = await rq({ + method: 'GET', + url: '/collectors', + qs: { + 'collector_friends.name': data.collectors[0].name, + }, + }); + + console.log('res', JSON.stringify(res.body, null, 2)); + + expect(Array.isArray(res.body)).toBe(true); + expect(res.body.length).toBe(1); + expect(res.body[0]).toMatchObject(data.collectors[1]); + }); + }); });