本文讲解如何在 laravel 中通过条件化 join 实现多态关系的精准关联——仅当 `scoreable_type` 匹配对应模型时,才分别关联 `supplementary_assessments` 或 `points_interaction_system` 表,并最终按用户 id 汇总所有积分。
在 Laravel 中处理多态关联(Polymorphic Relationships)时,若需在查询中按 scoreable_type 动态选择关联目标表(如仅当类型为 SupplementaryAssessment 时才 JOIN supplementary_assessments),不能依赖常规的 Eloquent 多态加载(如 morphTo()),而应使用原生查询构建器(DB::table())配合条件化 JOIN。
关键在于:必须使用 JOIN(内连接)而非 LEFT JOIN。原因在于 LEFT JOIN 会保留左侧 user_points 的所有行,即使 WHERE 条件不满足(如 scoreable_type 不匹配),右侧字段仍为 NULL,导致后续聚合逻辑混乱,且无法实现“仅对特定类型生效”的语义。而 JOIN 能天然确保:只有 scoreable_type 精确匹配且存在对应记录时,该行才被纳入结果集——这正是我们分表关联的前提。
以下是正确实现方式(含聚合与优化):