Я столкнулся с той же проблемой и успешно ее разрешил.
«Опубликовать данные JSON на сервере и получить файл excel. Этот файл excel создается сервером и возвращается как ответ клиенту. Загрузите этот ответ в виде файла с пользовательским именем в браузере "
$("#my-button").on("click", function(){
// Data to post
data = {
ids: [1, 2, 3, 4, 5]
};
// Use XMLHttpRequest instead of Jquery $ajax
xhttp = new XMLHttpRequest();
xhttp.onreadystatechange = function() {
var a;
if (xhttp.readyState === 4 && xhttp.status === 200) {
// Trick for making downloadable link
a = document.createElement('a');
a.href = window.URL.createObjectURL(xhttp.response);
// Give filename you wish to download
a.download = "test-file.xls";
a.style.display = 'none';
document.body.appendChild(a);
a.click();
}
};
// Post data to URL which handles post request
xhttp.open("POST", excelDownloadUrl);
xhttp.setRequestHeader("Content-Type", "application/json");
// You should set responseType as blob for binary responses
xhttp.responseType = 'blob';
xhttp.send(JSON.stringify(data));
});
Вышеприведенный фрагмент просто выполняет следующие действия
Здесь нам нужно тщательно задать несколько вещей в на стороне сервера. Я установил несколько заголовков в Python Django HttpResponse. Вы должны установить их соответственно, если используете другие языки программирования.
# In python django code
response = HttpResponse(file_content, content_type="application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
Так как я загружаю xls (excel) здесь, я скорректировал contentType на один. Вам нужно установить его в соответствии с типом файла. Вы можете использовать эту технику для загрузки любых файлов.
group by
вызывал у вас проблему. Все, что вам нужно сделать, это отсортировать desc, а затем ограничить набор результатов одной строкой
select `chat_messages`.`id`, `chat_messages`.`message`, `chat_messages`.`created_at`
from `chat_messages`
where `chat_messages`.`is_group` = 0
and `chat_messages`.`deleted_at` is null
and (`sender_id` =141 or `client_id` = 141)
order by `chat_messages`.`created_at` desc
LIMIT 1
Если вы группируете по message_token, вы присоединитесь ко всем этим сообщениям, вам нужно будет выбрать этот шаг сообщения в инструкции where, где message_token = XXX.
SELECT
`chat_messages`.`id`,
`chat_messages`.`message`,
`chat_messages`.`created_at`
FROM
`chat_messages`
WHERE
`chat_messages`.`is_group` = 0
and `chat_messages`.`deleted_at` is null
and (`sender_id` =141 or `client_id` = 141)
and `chat_messages`.`message_token`= "146_141"
ORDER BY
`chat_messages`.`created_at` desc,
`chat_messages`.`id` desc
Я предполагаю, что у вас есть модель сообщения (вы используете laravel)
Ниже запрос должен дать вам то, что вы хотите.
Message::whereSenderIdAndClientId($userId1,$userId2)
->orWhere([
["sender_id", $userId2],
["client_id",$userId1]
])
->orderBy("created_at","desc")
->first()
Получать сообщения между отправителем и клиентом, упорядочивать сообщения с помощью create_at - desc, а затем принимать первое сообщение, которое является последним сообщением между собой.
Почему вы группируете по message_token
?
Я думаю, что этот запрос будет действительным:
select `chat_messages`.`id`, `chat_messages`.`message`, `chat_messages`.`created_at`
from `chat_messages`
where `chat_messages`.`message_token` = '144_141'
and `chat_messages`.`is_group` = 0
and `chat_messages`.`deleted_at` is null
order by `chat_messages`.`created_at` desc
limit 1
После вашего редактирования:
select `chat_messages`.`id`, `chat_messages`.`message`, `chat_messages`.`created_at`
from (select * from `chat_messages` order by `chat_messages`.`created_at` desc) as chat_messages
where `chat_messages`.`is_group` = 0
and `chat_messages`.`deleted_at` is null
and (`sender_id` =141 or `client_id` = 141)
group by `chat_messages`.`message_token`;