From 5bd7826cc63f423cec41c8b08593396af75a5ac9 Mon Sep 17 00:00:00 2001 From: colemanw Date: Mon, 11 Sep 2023 22:32:06 -0400 Subject: [PATCH] Fix dev/core#4562 - APIv4: Implicit joins for email_primary, etc cause error --- Civi/Api4/Service/Schema/Joiner.php | 1 + .../phpunit/api/v4/Entity/ContactJoinTest.php | 29 +++++++++++++++++++ 2 files changed, 30 insertions(+) diff --git a/Civi/Api4/Service/Schema/Joiner.php b/Civi/Api4/Service/Schema/Joiner.php index 4d96d3461c..d42caa1708 100644 --- a/Civi/Api4/Service/Schema/Joiner.php +++ b/Civi/Api4/Service/Schema/Joiner.php @@ -78,6 +78,7 @@ class Joiner { */ public static function getExtraJoinSql(array $field, Api4SelectQuery $query): string { $prefix = empty($field['explicit_join']) ? '' : $field['explicit_join'] . '.'; + $prefix .= (empty($field['implicit_join']) ? '' : $field['implicit_join'] . '.'); $idField = $query->getField($prefix . $field['name'] . '.id'); return $idField['sql_name']; } diff --git a/tests/phpunit/api/v4/Entity/ContactJoinTest.php b/tests/phpunit/api/v4/Entity/ContactJoinTest.php index bc499367fd..4e9811e26c 100644 --- a/tests/phpunit/api/v4/Entity/ContactJoinTest.php +++ b/tests/phpunit/api/v4/Entity/ContactJoinTest.php @@ -21,6 +21,7 @@ namespace api\v4\Entity; use Civi\Api4\Address; use Civi\Api4\Contact; +use Civi\Api4\Contribution; use Civi\Api4\Email; use Civi\Api4\OptionValue; use api\v4\Api4TestBase; @@ -184,4 +185,32 @@ class ContactJoinTest extends Api4TestBase { $this->assertEquals($get['phone_primary.id'], $get['phone_billing.id']); } + public function testJoinToEmailId(): void { + $contact = $this->createTestRecord('Contact', [ + 'email_primary.email' => 'a@test.com', + 'email_billing.email' => 'b@test.com', + ]); + $emails = Email::get(FALSE) + ->addWhere('contact_id', '=', $contact['id']) + ->addOrderBy('is_primary', 'DESC') + ->execute()->column('id'); + $contribution = $this->createTestRecord('Contribution', [ + 'contact_id' => $contact['id'], + ]); + + $result = Contribution::get(FALSE) + ->addWhere('contact_id', '=', $contact['id']) + ->addSelect('contact_id.email_primary') + ->execute()->single(); + $this->assertEquals($emails[0], $result['contact_id.email_primary']); + + $result = Contribution::get(FALSE) + ->addWhere('contact_id', '=', $contact['id']) + ->addSelect('contact_id.email_primary.email') + ->addSelect('contact_id.email_billing') + ->execute()->single(); + $this->assertEquals('a@test.com', $result['contact_id.email_primary.email']); + $this->assertEquals($emails[1], $result['contact_id.email_billing']); + } + } -- 2.25.1