Laravel 与条件的多对多关系

Laravel many to many relationship with conditions

我有 4 张桌子 users, opportunities, level_translations and levels

用户
身份证、姓名、电子邮件

机会
id, client_name, user_id, total_price

级别
编号、最小值、最大值

level_translations
ID、名称、描述、区域设置,level_id

我想获取给定用户 ID 在当前语言环境中的关卡名称。我正在使用 laravel-translatable 包来本地化我的应用程序

要达到等级应该是这样的

select * from levels where sum(opportunities.total_price) < levels.max and sum(opportunities.total_price) > levels.min 

我找到了解决办法。我的解决方案包含两个部分
第一部分
创建一个 MYSQL Function,我称之为 sumUserOwnopportunities(USERID)

    DELIMITER $$
CREATE  FUNCTION `sumUserWonOpportunities`(USERID INT) 
 RETURNS double
BEGIN
     DECLARE TOTAL_SUM DOUBLE DEFAULT 0;
     SELECT SUM(opportunities.total_price) from opportunities 
     WHERE opportunities.user_id=USERID AND (opportunities.status=1 OR opportunities.status=2) INTO TOTAL_SUM;
        RETURN TOTAL_SUM;
END$$
DELIMITER ;

第二部分
在用户模型中

function level(){
   return  Level::where(function ($q){
            $q->where("min","<",DB::raw(" sumUserWonOpportunities($this->id)"))
            ->where("max",">",DB::raw(" sumUserWonOpportunities($this->id)"));
        })->first();
}

现在我可以打电话了

$user=User::find(1);
$level=$user->level()->name;// it will return level name in current locale 

希望有用。