Объединить или сгруппировать две модели, которые имеют полиморфную связь? - PullRequest
0 голосов
/ 27 ноября 2018

Я построил систему отчетов, в которой пользователи могут публиковать сообщения или комментарии, которые будут модерироваться, которые нарушают правила сайта.

Я хотел бы запросить и комментарий, и опубликовать отчеты вместе, и сгруппировать отчеты вместе под комментарием или публикацией, к которой они принадлежат.Тогда я хочу организовать по почте или комментариям 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)

Пользователь

  • id (int)
  • имя (строка)

Отношения

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 все вместе, чтобы добиться того, что я пытаюсь сделать?

Мне очень жальтакой длинный пост.

1 Ответ

0 голосов
/ 27 ноября 2018

Другой способ отформатировать это будет использовать вместо morphMany() это hasMany ()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...