jeudi 13 décembre 2018

Update table with results of a join

i have the following MSSQL query that scans the todo table and updates rows based on the data it gets from a query.

UPDATE Todo
    SET completedDate = todoCalls.minDate
    FROM Todo todoTable
    JOIN (SELECT Todo.id, MIN(CloudCall.CloudCallHistory.CallStarted) AS minDate
        FROM Todo
        JOIN CloudCall.CloudCallHistory ON CloudCall.CloudCallHistory.ObjectId = Todo.foreignId
        JOIN CloudCall.CloudCallNotebookTypeCategoryLink ON CloudCall.CloudCallNotebookTypeCategoryLink.CategoryCode = CloudCall.CloudCallHistory.CategoryId
        JOIN NotebookTypes ON NotebookTypes.NotebookTypeId = CloudCall.CloudCallNotebookTypeCategoryLink.NotebookTypeId
        WHERE CloudCall.CloudCallHistory.CallStarted > Todo.foreignDate
          AND Todo.completedDate IS NULL
          AND Todo.cancelledDate IS NULL
          AND NotebookTypes.NotebookFolderId = 175
          AND CloudCall.CloudCallHistory.CategoryId != 17427
          AND Todo.TypeId = 1
        GROUP BY Todo.id) AS todoCalls ON todoCalls.id = todoTable.id

This works fine in MSSQL but now im trying to convert it to a laravel/ eloquent query.

First I did the select which is:

$calls = Self::selectRaw('todo.id, MIN(CloudCall.CloudCallHistory.CallStarted) AS minDate')
            ->join('CloudCall.CloudCallHistory', 'CloudCall.CloudCallHistory.ObjectId', 'Todo.foreignId')
            ->join('CloudCall.CloudCallNotebookTypeCategoryLink', 'CloudCall.CloudCallNotebookTypeCategoryLink.CategoryCode', 'CloudCall.CloudCallHistory.CategoryId')
            ->join('NotebookTypes', 'NotebookTypes.NotebookTypeId', 'CloudCall.CloudCallNotebookTypeCategoryLink.NotebookTypeId')
            ->where('CloudCall.CloudCallHistory.CallStarted', '>', DB::Raw('[Todo].[foreignDate]'))
            ->whereNull('todo.completedDate')
            ->whereNull('todo.cancelledDate')
            ->where('NotebookTypes.NotebookFolderId', 175)
            ->where('CloudCall.CloudCallHistory.CategoryId', '!=', 17427)
            ->where('todo.typeId', $typeId)
            ->groupBy('todo.id');

When i view the results of this, I get the data I expect so the select part is correct. Now im trying to do the parts outside it and Im getting the error where I try to declare the table name allias. Here is what I have so far:

$query = DB::connection("sqlsrv")
           ->table('todo AS todoTable')
           ->update(['completedDate' => 'todoCalls.minDate'])
           ->joinSub($calls, 'todoCalls', function ($join)
                 {
                      $join->on('todoCalls.id', 'todoTable.id');
                 });



via Chebli Mohamed

Aucun commentaire:

Enregistrer un commentaire