Контроллер запросов Laravel «многие ко многим» - PullRequest
2 голосов
/ 04 ноября 2019

Итак, у меня есть таблица films, таблица conversations и сводная таблица film_conversation

Пленка (films)

'id'
'filmable_id',
'filmable_type',

Разговор (conversations)

'id'
'last_message_id'

FilmConversation (film_conversation)

'film_id'
'conversation_id'

Я хочу создать GET запросить захват всех разговоров, которые относятся к этому конкретному фильму, у меня есть этот запрос, но я не уверен, правильно ли я его получаю и как мне написать то, что возвращается в ответе

1026 * ConversationController:
/**
 * 
 */
public function conversations()
{
    $this->user = Auth::user();

    $film = Film::whereHas('conversations', function ($query) {
        return $query->where('id');
    })->get();

    return $film;
}

У меня есть дополнительный вопрос, следует ли вам напрямую включить этот запрос в метод запроса или разделить его на частный метод и включить его для повышения читабельности и беспорядка вызова? что было бы лучшей практикой? Это конечная точка, которую я выставляю для внешнего интерфейса.

Ответы [ 2 ]

1 голос
/ 04 ноября 2019
/**
 * @param Film $film
 * @return Collection|Conversations[]
 */
public function conversations(Film $film)
{
    return $film->conversations;
}

в файле маршрута

Route::get('conversations/{film}');

этот код вернет json представление коллекции моделей разговоров https://laravel.com/docs/5.7/eloquent-serialization#serializing-to-json

или вернет 404, если идентификатор фильма не существует.

1 голос
/ 04 ноября 2019

во-первых, вы не используете аутентифицированного пользователя, во-вторых, вы возвращаете коллекцию фильмов, в которых есть разговор, ограничение запроса ничего не делает, и вы можете просто получить доступ к $film->conversations, чтобы получитьколлекция

public function conversations($id)
{
    // Get all conversations for a specified film
    return Film::find($id)->conversations;
    // Get all conversations in all films that have a conversation
    $films = Film::whereHas('conversations')->with('conversations')->get();
    $conversations = $films->flatMap->conversations;
    return $conversations;
}

Надеюсь, это поможет

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