Пробуйте этот запрос с вычисленным псевдопараметром dialog_hold.
Суть в том, что этот параметр одинаковый для переписки пользователя 1 и пользователя 2 в ту и другую сторону.
Должно получаться число 1000002 при sender_id=1, recipient_id=2 и при sender_id=2, recipient_id=1.
По этому параметру можно отсортировать переписку так, чтобы беседы пользователей шли по порядку.
Значение 1000000 должно быть заведомо большое, чем возможно число пользователей в вашей системе в любой исторический период. Однако, max(user_id) * 1000000 + max(user_id) никогда не должно превышать макс. целочисленное значение, с которым может работать СУБД (верхний предел id пользователей, когда этот финт ушами способен работать).
select a.*
from (select d.id, d.tovar_id, d.sender_id, d.recipient_id, d.message,
case
when d.sender_id < d.recipient_id
then d.sender_id * 1000000 + d.recipient_id
else d.recipient_id * 1000000 + d.sender_id
end dialog_hold
from dialogs d
where d.tovar_id = :tovar_id
and (d.sender_id = :user_id or d.recipient_id = :user_id)
) a
order by a.tovar_id, a.dialog_hold, a.id