Ответ 1
Вы не сможете получить то, что хотите.
В общем, слияние должно быть простым с $collection->merge($otherCollection);
и сортироваться с $collection->sort();
. Однако слияние не будет работать так, как вы хотите, из-за отсутствия уникальных идентификаторов и столбца "Таблица", который вы хотите, вам нужно будет сделать это вручную.
И они на самом деле собираются быть коллекциями разных типов, я думаю (один из основанных на Eloquent\Model
будет Eloquent\Collection
, а другой будет стандартным Collection
), что может вызвать собственные проблемы, Таким образом, я бы предложил использовать DB:: table() для обоих и увеличить результаты с помощью столбцов, которые вы можете контролировать.
Что касается кода для этого, я не уверен, так как я не делаю много работы низкого уровня в Laravel, поэтому не знаю, как лучше всего создавать запросы. В любом случае, только потому, что это похоже на то, что вы начинаете испытывать боль, чтобы справиться с этим двумя запросами и слиянием PHP, я бы предложил сделать все это в одном запросе БД. Он будет выглядеть более аккуратным и, возможно, более удобным:
В SQL вам понадобится следующее:
SELECT * FROM
(
SELECT
`r`.`ticket_id`,
'replies' AS `table`,
`u`.`username`,
`r`.`message`,
`r`.`created_at`
FROM `replies` AS `r`
LEFT JOIN `users` AS `u`
ON `r`.`user_id` = `u`.`id`
WHERE `r`.`ticket_id` = ?
) UNION (
SELECT
`l`.`ticket_id`,
'logs' AS `table`,
`u`.`username`,
`l`.`action` AS `message`,
`l`.`created_at`
FROM `logs` AS `l`
LEFT JOIN `users` AS `u`
ON `l`.`user_id` = `u`.`id`
WHERE `l`.ticket_id` = ?
)
ORDER BY `created_at` DESC
Это довольно понятно: выполните два запроса, вернув те же столбцы, UNION
их, а затем отсортируйте этот набор результатов в MySQL. Надеюсь, он (или что-то подобное, как я должен был угадать вашу структуру базы данных) будет работать для вас.
Что касается перевода этого слова в запрос Laravel DB::
, я думаю, что до вас.