@@ -3252,6 +3252,252 @@ public function testRelationshipTypeQueries(): void
32523252 $ database ->deleteCollection ('coursesMtm ' );
32533253 }
32543254
3255+ /**
3256+ * Test querying parent documents by relationship document $id
3257+ */
3258+ public function testQueryByRelationshipId (): void
3259+ {
3260+ /** @var Database $database */
3261+ $ database = static ::getDatabase ();
3262+
3263+ if (!$ database ->getAdapter ()->getSupportForRelationships ()) {
3264+ $ this ->expectNotToPerformAssertions ();
3265+ return ;
3266+ }
3267+
3268+ $ database ->createCollection ('usersRelId ' );
3269+ $ database ->createCollection ('postsRelId ' );
3270+
3271+ $ database ->createAttribute ('usersRelId ' , 'name ' , Database::VAR_STRING , 255 , true );
3272+ $ database ->createAttribute ('postsRelId ' , 'title ' , Database::VAR_STRING , 255 , true );
3273+
3274+ $ database ->createRelationship (
3275+ collection: 'postsRelId ' ,
3276+ relatedCollection: 'usersRelId ' ,
3277+ type: Database::RELATION_MANY_TO_ONE ,
3278+ twoWay: true ,
3279+ id: 'user ' ,
3280+ twoWayKey: 'posts '
3281+ );
3282+
3283+ // Create test users
3284+ $ user1 = $ database ->createDocument ('usersRelId ' , new Document ([
3285+ '$id ' => 'user1 ' ,
3286+ '$permissions ' => [
3287+ Permission::read (Role::any ()),
3288+ Permission::update (Role::any ()),
3289+ ],
3290+ 'name ' => 'Alice ' ,
3291+ ]));
3292+
3293+ $ user2 = $ database ->createDocument ('usersRelId ' , new Document ([
3294+ '$id ' => 'user2 ' ,
3295+ '$permissions ' => [
3296+ Permission::read (Role::any ()),
3297+ Permission::update (Role::any ()),
3298+ ],
3299+ 'name ' => 'Bob ' ,
3300+ ]));
3301+
3302+ // Create posts related to users
3303+ $ database ->createDocument ('postsRelId ' , new Document ([
3304+ '$id ' => 'post1 ' ,
3305+ '$permissions ' => [
3306+ Permission::read (Role::any ()),
3307+ Permission::update (Role::any ()),
3308+ ],
3309+ 'title ' => 'Alice Post 1 ' ,
3310+ 'user ' => 'user1 ' ,
3311+ ]));
3312+
3313+ $ database ->createDocument ('postsRelId ' , new Document ([
3314+ '$id ' => 'post2 ' ,
3315+ '$permissions ' => [
3316+ Permission::read (Role::any ()),
3317+ Permission::update (Role::any ()),
3318+ ],
3319+ 'title ' => 'Alice Post 2 ' ,
3320+ 'user ' => 'user1 ' ,
3321+ ]));
3322+
3323+ $ database ->createDocument ('postsRelId ' , new Document ([
3324+ '$id ' => 'post3 ' ,
3325+ '$permissions ' => [
3326+ Permission::read (Role::any ()),
3327+ Permission::update (Role::any ()),
3328+ ],
3329+ 'title ' => 'Bob Post ' ,
3330+ 'user ' => 'user2 ' ,
3331+ ]));
3332+
3333+ // Query posts by user.$id - this is the key test
3334+ $ posts = $ database ->find ('postsRelId ' , [
3335+ Query::equal ('user.$id ' , ['user1 ' ]),
3336+ ]);
3337+ $ this ->assertCount (2 , $ posts );
3338+ $ this ->assertEquals ('post1 ' , $ posts [0 ]->getId ());
3339+ $ this ->assertEquals ('post2 ' , $ posts [1 ]->getId ());
3340+
3341+ // Query posts by different user.$id
3342+ $ posts = $ database ->find ('postsRelId ' , [
3343+ Query::equal ('user.$id ' , ['user2 ' ]),
3344+ ]);
3345+ $ this ->assertCount (1 , $ posts );
3346+ $ this ->assertEquals ('post3 ' , $ posts [0 ]->getId ());
3347+
3348+ // Query posts by multiple user.$id values
3349+ $ posts = $ database ->find ('postsRelId ' , [
3350+ Query::equal ('user.$id ' , ['user1 ' , 'user2 ' ]),
3351+ ]);
3352+ $ this ->assertCount (3 , $ posts );
3353+
3354+ // Query users by posts.$id (inverse direction)
3355+ $ users = $ database ->find ('usersRelId ' , [
3356+ Query::equal ('posts.$id ' , ['post1 ' ]),
3357+ ]);
3358+ $ this ->assertCount (1 , $ users );
3359+ $ this ->assertEquals ('user1 ' , $ users [0 ]->getId ());
3360+
3361+ // Clean up MANY_TO_ONE test
3362+ $ database ->deleteCollection ('usersRelId ' );
3363+ $ database ->deleteCollection ('postsRelId ' );
3364+
3365+ // Test ONE_TO_ONE relationship - query profile by user.$id
3366+ $ database ->createCollection ('usersOtoId ' );
3367+ $ database ->createCollection ('profilesOtoId ' );
3368+
3369+ $ database ->createAttribute ('usersOtoId ' , 'username ' , Database::VAR_STRING , 255 , true );
3370+ $ database ->createAttribute ('profilesOtoId ' , 'bio ' , Database::VAR_STRING , 255 , true );
3371+
3372+ $ database ->createRelationship (
3373+ collection: 'usersOtoId ' ,
3374+ relatedCollection: 'profilesOtoId ' ,
3375+ type: Database::RELATION_ONE_TO_ONE ,
3376+ twoWay: true ,
3377+ id: 'profile ' ,
3378+ twoWayKey: 'user '
3379+ );
3380+
3381+ $ userOto1 = $ database ->createDocument ('usersOtoId ' , new Document ([
3382+ '$id ' => 'userOto1 ' ,
3383+ '$permissions ' => [
3384+ Permission::read (Role::any ()),
3385+ Permission::update (Role::any ()),
3386+ ],
3387+ 'username ' => 'alice ' ,
3388+ ]));
3389+
3390+ $ database ->createDocument ('profilesOtoId ' , new Document ([
3391+ '$id ' => 'profileOto1 ' ,
3392+ '$permissions ' => [
3393+ Permission::read (Role::any ()),
3394+ Permission::update (Role::any ()),
3395+ ],
3396+ 'bio ' => 'Software Engineer ' ,
3397+ 'user ' => 'userOto1 ' ,
3398+ ]));
3399+
3400+ // Query profiles by user.$id
3401+ $ profiles = $ database ->find ('profilesOtoId ' , [
3402+ Query::equal ('user.$id ' , ['userOto1 ' ]),
3403+ ]);
3404+ $ this ->assertCount (1 , $ profiles );
3405+ $ this ->assertEquals ('profileOto1 ' , $ profiles [0 ]->getId ());
3406+
3407+ // Query users by profile.$id (inverse)
3408+ $ users = $ database ->find ('usersOtoId ' , [
3409+ Query::equal ('profile.$id ' , ['profileOto1 ' ]),
3410+ ]);
3411+ $ this ->assertCount (1 , $ users );
3412+ $ this ->assertEquals ('userOto1 ' , $ users [0 ]->getId ());
3413+
3414+ // Clean up ONE_TO_ONE test
3415+ $ database ->deleteCollection ('usersOtoId ' );
3416+ $ database ->deleteCollection ('profilesOtoId ' );
3417+
3418+ // Test MANY_TO_MANY relationship - query projects by developer.$id
3419+ $ database ->createCollection ('developersMtmId ' );
3420+ $ database ->createCollection ('projectsMtmId ' );
3421+
3422+ $ database ->createAttribute ('developersMtmId ' , 'devName ' , Database::VAR_STRING , 255 , true );
3423+ $ database ->createAttribute ('projectsMtmId ' , 'projectName ' , Database::VAR_STRING , 255 , true );
3424+
3425+ $ database ->createRelationship (
3426+ collection: 'developersMtmId ' ,
3427+ relatedCollection: 'projectsMtmId ' ,
3428+ type: Database::RELATION_MANY_TO_MANY ,
3429+ twoWay: true ,
3430+ id: 'projects ' ,
3431+ twoWayKey: 'developers '
3432+ );
3433+
3434+ $ dev1 = $ database ->createDocument ('developersMtmId ' , new Document ([
3435+ '$id ' => 'dev1 ' ,
3436+ '$permissions ' => [
3437+ Permission::read (Role::any ()),
3438+ Permission::update (Role::any ()),
3439+ ],
3440+ 'devName ' => 'Alice ' ,
3441+ ]));
3442+
3443+ $ dev2 = $ database ->createDocument ('developersMtmId ' , new Document ([
3444+ '$id ' => 'dev2 ' ,
3445+ '$permissions ' => [
3446+ Permission::read (Role::any ()),
3447+ Permission::update (Role::any ()),
3448+ ],
3449+ 'devName ' => 'Bob ' ,
3450+ ]));
3451+
3452+ $ database ->createDocument ('projectsMtmId ' , new Document ([
3453+ '$id ' => 'project1 ' ,
3454+ '$permissions ' => [
3455+ Permission::read (Role::any ()),
3456+ Permission::update (Role::any ()),
3457+ ],
3458+ 'projectName ' => 'Project Alpha ' ,
3459+ 'developers ' => ['dev1 ' , 'dev2 ' ],
3460+ ]));
3461+
3462+ $ database ->createDocument ('projectsMtmId ' , new Document ([
3463+ '$id ' => 'project2 ' ,
3464+ '$permissions ' => [
3465+ Permission::read (Role::any ()),
3466+ Permission::update (Role::any ()),
3467+ ],
3468+ 'projectName ' => 'Project Beta ' ,
3469+ 'developers ' => ['dev1 ' ],
3470+ ]));
3471+
3472+ // Query projects by developer.$id
3473+ $ projects = $ database ->find ('projectsMtmId ' , [
3474+ Query::equal ('developers.$id ' , ['dev1 ' ]),
3475+ ]);
3476+ $ this ->assertCount (2 , $ projects );
3477+
3478+ $ projects = $ database ->find ('projectsMtmId ' , [
3479+ Query::equal ('developers.$id ' , ['dev2 ' ]),
3480+ ]);
3481+ $ this ->assertCount (1 , $ projects );
3482+ $ this ->assertEquals ('project1 ' , $ projects [0 ]->getId ());
3483+
3484+ // Query developers by project.$id (inverse)
3485+ $ developers = $ database ->find ('developersMtmId ' , [
3486+ Query::equal ('projects.$id ' , ['project1 ' ]),
3487+ ]);
3488+ $ this ->assertCount (2 , $ developers );
3489+
3490+ $ developers = $ database ->find ('developersMtmId ' , [
3491+ Query::equal ('projects.$id ' , ['project2 ' ]),
3492+ ]);
3493+ $ this ->assertCount (1 , $ developers );
3494+ $ this ->assertEquals ('dev1 ' , $ developers [0 ]->getId ());
3495+
3496+ // Clean up MANY_TO_MANY test
3497+ $ database ->deleteCollection ('developersMtmId ' );
3498+ $ database ->deleteCollection ('projectsMtmId ' );
3499+ }
3500+
32553501 /**
32563502 * Comprehensive test for all query types on relationships
32573503 */
0 commit comments