Sql server Laravel如何创建fluent查询生成器与子查询联接

Sql server Laravel如何创建fluent查询生成器与子查询联接,sql-server,laravel-5,Sql Server,Laravel 5,我在执行以下任务时遇到问题: $result = DB::table("SRO_VT_LOG.dbo._LogEventChar AS c with(NOLOCK)") ->select('l.CharID, DATEDIFF(MINUTE, l.EventTime, GETDATE()) MinutesOnline, l.EventTime OnlineSince, COUNT(1) OVER (PARTITION BY c.EventID) AS Onl

我在执行以下任务时遇到问题:

$result = DB::table("SRO_VT_LOG.dbo._LogEventChar AS c with(NOLOCK)")
                ->select('l.CharID, DATEDIFF(MINUTE, l.EventTime, GETDATE()) MinutesOnline, l.EventTime OnlineSince, COUNT(1) OVER (PARTITION BY c.EventID) AS OnlineCount')
                ->join(DB::raw('(SELECT CharID, MAX(EventTime) EventTime FROM SRO_VT_LOG.dbo._LogEventChar with(NOLOCK) WHERE EventID in (4, 6) GROUP BY CharID) AS l'),
                    function($join)
                    {
                        $join->on('c.EventTime', '=', 'l.EventTime')
                            ->on('c.CharID', '=', 'l.CharID')
                        ;
                    })
            ->get();
遇到错误,我使用的是laravel 5.5版sql server 2014

SQLSTATE[42S22]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Invalid column name 'CharID, DATEDIFF(MINUTE, l'. (42S22)
SQLSTATE[42S22]: [Microsoft][ODBC Driver 11 for SQL Server][SQL Server]Invalid column name 'CharID, DATEDIFF(MINUTE, l'. (42S22)
根据,您需要分别指定select中的每个字段,而您的字段似乎位于单个字符串中

上面链接的文档中的一个示例:

$users=DB::table'users'->选择'name','email as user\u email'->获取

所以我想你想要的是:

$result = DB::table("SRO_VT_LOG.dbo._LogEventChar AS c with(NOLOCK)")
                ->select('l.CharID', 'DATEDIFF(MINUTE, l.EventTime, GETDATE()) as MinutesOnline', 'l.EventTime as OnlineSince', 'COUNT(1) OVER (PARTITION BY c.EventID) AS OnlineCount')
                ->join(DB::raw('(SELECT CharID, MAX(EventTime) EventTime FROM SRO_VT_LOG.dbo._LogEventChar with(NOLOCK) WHERE EventID in (4, 6) GROUP BY CharID) AS l'),
                    function($join)
                    {
                        $join->on('c.EventTime', '=', 'l.EventTime')
                            ->on('c.CharID', '=', 'l.CharID')
                        ;
                    })
            ->get();

我已编辑,错误仍然显示:SQLSTATE[42000]:[Microsoft][ODBC Driver 11 for SQL Server][SQL Server]无法绑定多部分标识符c.EventTime。42000 SQLSTATE[42000]:[Microsoft][ODBC驱动程序11 for SQL Server][SQL Server]无法绑定多部分标识符c.EventTime。42000好的,这是另一个问题,它表明EventTime列不在表c中。这是因为您已将该字段别名为Online,因此我怀疑您需要在联接中使用该字段名,而不是基本的真实字段名?接下来我需要做什么?我已仔细检查,不知道如何正确执行,我在SQL Server Management Studio中执行的操作没有错误。我猜您希望在加入中使用$join->on'c.OnlineSince'、'='、'l.EventTime'而不是$join->on'c.EventTime'、'='、'l.EventTime'吗?可能最好为此创建一个新问题,因为它实际上是一个不同的问题…我的原始查询如下所示:选择l.CharID、DATEDIFFMINUTE、l.EventTime、GETDATE'MinutesOnline Online、l.EventTime'OnlineBegin、COUNT1除以来自dbo的c.EventID'OnlineCount分区。\u LogEventChar c with Nolock JOIN SELECT CharID,来自dbo的MAXEventTime'EventTime'。\u LogEventChar With Nolock,其中EventID在4,6组中,由CharID l在c.EventTime=l.EventTime和c.CharID=l.CharID中,其中c.EventID=4按分钟排序在线描述