Я построил систему отчетов, в которой пользователи могут публиковать сообщения или комментарии, которые будут модерироваться, которые нарушают правила сайта.
Я хотел бы запросить и комментарий, и опубликовать отчеты вместе, и сгруппировать отчеты вместе под комментарием или публикацией, к которой они принадлежат.Тогда я хочу организовать по почте или комментариям created_at
поля.
Таблицы
Сообщений
- id (int)
- содержание (текст)
- title(текст)
- create_at
Комментарий
- id (int)
- content (int)
- post_id (int)
- create_at
Отчет
- id (int)
- user_id (int)
- content (text)
- reportable_id (int)
- reportable_type (string)
Пользователь
Отношения
Post.php
public function reports()
{
return $this->morphMany('App\Report', 'reportable');
}
Comment.php
public function reports()
{
return $this->morphMany('App\Report', 'reportable');
}
Report.php
public function reportable()
{
return $this->morphTo();
}
public function user()
{
return $this->belongsTo(User::class, 'user_id');
}
Что я хотел бы сделать
Я хочу организовать отчеты тремя разными способами.
1. Получить все сообщения с отчетами и пользователями, которые составили отчет и упорядочить по последним.
$posts = Post::whereHas('reports')->with('reports.user', 'comments')->latest()->get();
Вывод:
Это сообщение от 1 дня назад
- Сообщение 1 о комментарии пользователя 1
- Сообщение 2 о комментарии пользователя 4
Это сообщение от 3 дней назад
- Сообщение 1 от пользователя 3
- Сообщение 2 от пользователя 5
2. Получите все комментарии с отчетами, пользователей, которые сделали отчет, пост, под которым находится комментарий, и упорядочите его по последней.
$comments = Comment::whereHas('reports')->with('reports.user', 'post')->latest()->get();
Это сообщение от 1 день назад
Гадкий комментарий к сообщению пользователя 10
- Сообщение 1 от пользователя 1
- Сообщение 2 от пользователя 4
Это сообщение от 3 дней назад
Еще один неприятный комментарий к сообщению пользователя 15
- Сообщение 1 от пользователя 3
- Сообщение 2 от пользователя 5
3. Вот тут у меня проблемы.Я хотел бы организовать Post
и Comment
отчеты вместе и поддерживать группирование отчетов в соответствии с моделью, как указано выше.Пример:
Это сообщение от 1 день назад
- Сообщение 1 о комментарии пользователя 1
- Сообщение 2 о комментарии пользователя4
Это сообщение от 1 день назад
Гадкий комментарий к сообщению пользователя 10
- Сообщение 1 от пользователя 1
- Сообщение 2 от пользователя 4
Это сообщение от 3 дней назад
- Сообщение 1 от пользователя 3
- Сообщение 2 от пользователя 5
Это сообщение от 3 дней назад
Еще один неприятный комментарий к сообщению пользователя 15
- Сообщение 1 от пользователя 3
- Сообщение 2 от пользователя 5
Вот моя попыткапри попытке получить вместе отчеты Post
и Comment
:
$reports = Report::with('reportable')->latest()->get();
//return view('reports.index', compact('posts'));
Вывод
"7": [
{
"id": 9,
"user_id": 2,
"content": "Guy is being a jerk",
"reportable_id": 7,
"reportable_type": "App\\Post",
"created_at": "2017-08-22 01:31:25",
"updated_at": "2017-08-22 01:31:25",
"is_handled": 0,
"reportable": {
"id": 7,
"author_id": 1,
"category_id": null,
"title": "A forum post!",
"created_at": "2017-08-08 23:03:22",
"updated_at": "2017-08-08 23:03:22",
}
},
{
"id": 8,
"user_id": 2,
"content": "this guy is being rude",
"reportable_id": 7,
"reportable_type": "App\\Post",
"created_at": "2017-08-22 01:31:02",
"updated_at": "2017-08-22 01:31:02",
"is_handled": 0,
"reportable": {
"id": 7,
"author_id": 1,
"category_id": null,
"title": "A forum post!",
"created_at": "2017-08-08 23:03:22",
"updated_at": "2017-08-08 23:03:22",
}
},
{
"id": 6,
"user_id": 1,
"content": "Report number 1",
"reportable_id": 7,
"reportable_type": "App\\Post",
"created_at": "2017-08-21 20:40:55",
"updated_at": "2017-08-21 20:40:55",
"is_handled": 0,
"reportable": {
"id": 7,
"author_id": 1,
"title": "A forum post!",
"created_at": "2017-08-08 23:03:22",
"updated_at": "2017-08-08 23:03:22"
}
}
],
"9": [
{
"id": 10,
"user_id": 4,
"content": "Rule 1",
"reportable_id": 9,
"reportable_type": "App\\Post",
"created_at": "2017-09-20 21:31:50",
"updated_at": "2017-09-20 21:31:50",
"is_handled": 0,
"reportable": {
"id": 9,
"author_id": 1,
"title": "Hello world!",
"created_at": "2017-09-10 16:49:07",
"updated_at": "2017-09-10 16:49:07",
}
}
],
"24": [
{
"id": 11,
"user_id": 4,
"content": "Rule 2",
"reportable_id": 24,
"reportable_type": "App\\Comment",
"created_at": "2017-09-20 22:28:15",
"updated_at": "2017-09-21 03:03:28",
"is_handled": 1,
"reportable": {
"id": 24,
"user_id": 1,
"content": "<p>A comment to be edited</p>",
"created_at": "2017-09-17 22:41:35",
"updated_at": "2017-09-17 22:41:35",
"commentable_id": 9,
"commentable_type": "App\\Forum"
}
}
]
Проблемы, с которыми я сталкиваюсь при форматировании отчетаправо, нумерация страниц и организация отчетов к Comment
и Post
created_at
дате.Есть ли способ просто просто запросить модель Post
, Comments
, User
и Reports
все вместе, чтобы добиться того, что я пытаюсь сделать?
Мне очень жальтакой длинный пост.