首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找到即将到期的资格证书

找到即将到期的资格证书
EN

Code Review用户
提问于 2021-11-23 11:40:14
回答 1查看 36关注 0票数 -1

我有以下函数,它返回StaffQualifications,其中要么是限定到期,要么是限定类型过期,但是这个部分似乎不太适合我,因为它分割了string.这是否应该是两个独立的函数,即使95%的查询是相同的?

代码语言:javascript
复制
    if ($qualification instanceof Qualification) {
        $sql .= "AND q.id = :qualificationId ";
    } elseif ($qualificationType instanceof QualificationType) {
        $sql .= "AND q.qualification_type_id = :qualificationTypeId ";
    }

上面的感觉不太好,但不知道如何更好。

代码语言:javascript
复制
/**
 * @return StaffQualification[]
 */
public function getStaffQualificationsExpiringOnQualificationOrQualificationType(?Qualification $qualification, ?QualificationType $qualificationType): array
{
    if ($qualification === null && $qualificationType === null) {
        throw new \Exception('Qualification or QualificationType must not be null');
    }
    if ($qualification instanceof Qualification && $qualificationType instanceof QualificationType) {
        throw new \Exception('Only one of Qualification or QualificationType can be present');
    }

    $sql = "
    SELECT *
    FROM staff_qualification AS sq ";
// Complicated SQL ensues that I've omitted from this SE question...

    if ($qualification instanceof Qualification) {
        $sql .= "AND q.id = :qualificationId ";
    } elseif ($qualificationType instanceof QualificationType) {
        $sql .= "AND q.qualification_type_id = :qualificationTypeId ";
    }

    $sql .= "
    GROUP BY sq.id
    ORDER BY sq.end_date
    ;
    ";

    $rsm = new ResultSetMapping();
    $rsm->addEntityResult(StaffQualification::class, 'sq');
    $rsm->addJoinedEntityResult(Staff::class, 's', 'sq', 'staff');
    $rsm->addFieldResult('sq', 'id', 'id');
    $rsm->addFieldResult('s', 'staff_id', 'id');
    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
    if ($qualification instanceof Qualification) {
        $query->setParameter('qualificationId', $qualification->getId());
    } elseif ($qualificationType instanceof QualificationType) {
        $query->setParameter('qualificationTypeId', $qualificationType->getId());
    }
    $result = $query->getResult();
    return $result;
}
EN

回答 1

Code Review用户

回答已采纳

发布于 2021-11-23 14:47:43

我认为最好的做法是提取字符串构建之外的逻辑并将其传递进来。您可以按照下面的内联方式或使用sprintf或Heredoc执行此操作。

代码语言:javascript
复制
/**
 * @param ?Qualification $qualification
 * @param ?QualificationType $qualificationType
 * @return StaffQualification[]
 * @throws Exception
 */
public function getStaffQualificationsExpiringOnQualificationOrQualificationType(
    ?Qualification $qualification,
    ?QualificationType $qualificationType
): array
{
    if ($qualification === null && $qualificationType === null) {
        throw new Exception('Qualification or QualificationType must not be null');
    }
    if ($qualification instanceof Qualification && $qualificationType instanceof QualificationType) {
        throw new Exception('Only one of Qualification or QualificationType can be present');
    }

    if ($qualification instanceof Qualification) {
        $filterSql = "q.id = :qualificationId ";
    } elseif ($qualificationType instanceof QualificationType) {
        $filterSql = "q.qualification_type_id = :qualificationTypeId ";
    }
    $sql = "
    SELECT *
    FROM staff_qualification AS sq
    WHERE 1=1
    AND $filterSql
    GROUP BY sq.id
    ORDER BY sq.end_date
    ;
    ";

    $rsm = new ResultSetMapping();
    $rsm->addEntityResult(StaffQualification::class, 'sq');
    $rsm->addJoinedEntityResult(Staff::class, 's', 'sq', 'staff');
    $rsm->addFieldResult('sq', 'id', 'id');
    $rsm->addFieldResult('s', 'staff_id', 'id');
    $query = $this->getEntityManager()->createNativeQuery($sql, $rsm);
    if ($qualification instanceof Qualification) {
        $query->setParameter('qualificationId', $qualification->getId());
    } elseif ($qualificationType instanceof QualificationType) {
        $query->setParameter('qualificationTypeId', $qualificationType->getId());
    }
    $result = $query->getResult();
    return $result;
}
票数 0
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/270325

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档