Eloquent ORM:复杂的左连接坚持使用值作为列名

时间:2016-05-29 00:52:04

标签: php sql laravel eloquent

我的一个模型中有以下Eloquent Query:

    return self::where('sequence', '=', $sequence)->where('interval', '=', $minutes)
        ->leftJoin('wallet', 'wallet_stats.wallet_id', '=', 'wallet.id')
        ->leftJoin('balance', function($join) use ($uid)
        {
            $join->on('balance.wallet_id', '=', 'wallet_stats.wallet_id')
                 ->on('balance.user_id', '=', $uid);
        })
        ->orderBy('volume', 'ASC')->get(['symbol', 'name', 'volume', 'start_price', 'end_price']);

我遇到的问题是以下错误消息:

  

糟糕! SQLSTATE [42S22]:未找到列:1054未知列' 2'在   '关于条款' (SQL:选择symbolnamevolumestart_price,   来自end_price的{​​{1}}已离开加入wallet_stats   walletwallet_stats = wallet_idwallet离开加入id   balancebalance = wallet_idwallet_stats和   wallet_idbalance = user_id其中2 = 0且sequence = 1440   按interval asc)订购

出于某种原因,Eloquent坚持使用$ uid的值(在第二个" on" join条件下)作为列名而不是文字值。

有没有人知道如何解决这个问题并让它接受这种连接规范中的字面值?

2 个答案:

答案 0 :(得分:1)

我似乎无法复制您的错误,但这是我在过去的实例中使用的。 GiedriusKiršys在你的问题评论中提出的建议也很好。

 return self::where('sequence', '=', $sequence)->where('interval', '=', $minutes)
        ->leftJoin('wallet', 'wallet_stats.wallet_id', '=', 'wallet.id')
        ->leftJoin('balance', function($join) use ($uid)
        {
            $join->on('balance.wallet_id', '=', 'wallet_stats.wallet_id')
                 ->on('balance.user_id', '=', \DB::raw($uid));
        })
        ->orderBy('volume', 'ASC')->get(['symbol', 'name', 'volume', 'start_price', 'end_price']);

如果您已摆脱DB

,则假设您尚未导入\

答案 1 :(得分:1)

使用 - > where()表示第二个on子句,例如

    ->leftJoin('balance', function($join) use ($uid)
    {
        $join->on('balance.wallet_id', '=', 'wallet_stats.wallet_id');
        $join->where('balance.user_id','=', $uid);
    })

或者,将DB :: raw()用于on子句值

   ->leftJoin('balance', function($join) use ($uid)
    {
        $join->on('balance.wallet_id', '=', 'wallet_stats.wallet_id');
        $join->on('balance.user_id', '=', DB::raw($uid));
    })