Перевод MySQL-запроса в Laravel

У меня есть веб-приложение, которое в настоящее время использует PHP для сортировки некоторых данных, хранящихся в базе данных MySQL. В настоящее время я улучшаю приложение, используя инфраструктуру Laravel, но у меня возникают проблемы при сопоставлении всех команд MySQL с командами, используемыми DB в Ларавеле.

У меня есть таблица, в которой есть некоторые дубликаты author имена и хотят суммировать citations значения столбцов для этих дубликатов. Так, например, у меня может быть два автора в таблице под названием John Doeодин с 30 цитаты и другие с 20, После выполнения текущего запроса у меня будет две строки для John Doeкак с 50 цитаты. Я тогда использую GROUP BY чтобы получить только один экземпляр автора. Вот текущий запрос из моего кода PHP:

// sum citations for duplicate authors
mysqli_query($connect, "UPDATE searchresponse AS r JOIN(SELECT author, SUM(citations) AS citations, COUNT(author) AS n FROM searchresponse GROUP BY author) AS grp ON grp.author = r.author SET r.citations = grp.citations");

Теперь я пытался что-то вроде следующего, но я не уверен, как реплицировать такие команды, как AS или же SET в Ларавеле:

// select relevant data
$sumData = DB::table('searchresponse')
-> (something);
// insert selected data into table
foreach ($sumData as $value) {
DB::table('searchresponse')->insert(
[
'author'   => $value->author,
'citations => $value->citations
]
);
}

В основном мне нужно знать, как в Laravel вы ссылаетесь на таблицу AS что-то, чтобы я мог сравнить его с собой, как в моем оригинальном методе, где он ссылается searchresponse AS r, Или, на самом деле, просто как скопировать мой оригинальный запрос PHP MySQL в Laravel.

РЕДАКТИРОВАТЬ

Работая над этим, это больше похоже на то, что мне нужно сделать:

// sum citations for duplicate authors
function sumCites($data) {
$sumAll = DB::table('searchresponse')
->join('searchresponse', 'searchresponse.citations', '=', 'searchresponse.citations')
->where('searchresponse.author', '=', 'searchresponse.author')
->get();
}

Но я все еще получаю ошибку

1

Решение

Попробуйте следующий способ получить данные:

function sumCites($data){
// Update first
\DB::update('UPDATE searchresponse AS r
JOIN(
SELECT author, SUM(citations) AS citations, COUNT(author) AS n FROM    searchresponse GROUP BY author
) grp
ON grp.author = r.author
SET r.citations = grp.citations');

//Now fetch all data from that table
$sumAll = \DB::table('searchresponse')->get();
return $sumAll;
}

Если вы хотите обновить таблицу, вы можете использовать свой sql напрямую, как

1

Другие решения

Вы присоединяетесь к одной и той же таблице, поэтому вам нужно выполнить объединение с использованием псевдонима таблицы, попробуйте что-то вроде ниже:

// sum citations for duplicate authors
function sumCites($data) {
$sumAll = DB::update('searchresponse')
->join('searchresponse as b', 'searchresponse.citations', '=', 'b.citations')
->where('searchresponse.author', '=', 'b.author')
->get();
}
1