. * * The interactive user interfaces in modified source and object code versions * of this program must display Appropriate Legal Notices, as required under * Section 5 of the GNU Affero General Public License version 3. * * In accordance with Section 7(b) of the GNU Affero General Public License version 3, * these Appropriate Legal Notices must retain the display of the "EspoCRM" word. ************************************************************************/ namespace Espo\Core\Select\Helpers; use Espo\Core\Name\Field; use Espo\Entities\User; use Espo\ORM\Defs; use Espo\ORM\Query\Part\Condition; use Espo\ORM\Query\Part\Expression; use Espo\ORM\Query\Part\WhereItem; use Espo\ORM\Query\SelectBuilder as QueryBuilder; /** * @since 8.5.0 */ class RelationQueryHelper { public function __construct( private Defs $defs, ) {} public function prepareAssignedUsersWhere(string $entityType, string $userId): WhereItem { return $this->prepareRelatedUsersWhere( $entityType, $userId, 'assignedUsers', User::RELATIONSHIP_ENTITY_USER ); } public function prepareCollaboratorsWhere(string $entityType, string $userId): WhereItem { return $this->prepareRelatedUsersWhere( $entityType, $userId, Field::COLLABORATORS, User::RELATIONSHIP_ENTITY_COLLABORATOR ); } private function prepareRelatedUsersWhere( string $entityType, string $userId, string $field, string $relationship ): WhereItem { $relationDefs = $this->defs ->getEntity($entityType) ->getRelation($field); $middleEntityType = ucfirst($relationDefs->getRelationshipName()); $key1 = $relationDefs->getMidKey(); $key2 = $relationDefs->getForeignMidKey(); $joinWhere = [ "m.$key1:" => 'id', 'm.deleted' => false, ]; if ($middleEntityType === $relationship) { $joinWhere['m.entityType'] = $entityType; } $subQuery = QueryBuilder::create() ->select('id') ->from($entityType) ->leftJoin($middleEntityType, 'm', $joinWhere) ->where(["m.$key2" => $userId]) ->build(); return Condition::in( Expression::column('id'), $subQuery ); } }