Создание URL с FK

Я пытаюсь создать URL-адрес, который читается как www.localhost/forum/{slug}/thread={id}, но у меня возникают проблемы. Часть {id} возвращается, поскольку это идентификатор потока, но часть {slug}, которую я пытаюсь получить с помощью внешнего ключа, и получить проблему.

Call to a member function forums() on null

вот мои таблицы Forum: id, name, slug, timestamps Thread: id, name, forum_id, user_id

вот мое отношение к моей модели потока

public function forums(){
    return $this->belongsTo('App\Forum');
}

и вот мой код на моем ThreadController

    public function show($id, $slug)
{
    //
    $thread = Thread::find($id);
    $thread->forums()->slug = $slug;

    return view('forum.thread')->withThread($thread);
}

Любые идеи о том, как я могу получить слаг форума в URL?


person detinu20    schedule 12.04.2018    source источник


Ответы (3)


Потому что $thread = Thread::find($id) не получил ни одной темы. Вы можете использовать функцию findOrFiail или проверить, существует ли поток, и после этого вызвать forums().

person Vahe Galstyan    schedule 12.04.2018
comment
если он существует, почему вы получаете эту ошибку? Вызов функции-члена forums() при нулевом значении ?? Можете ли вы добавить var_dump($thread);diel; перед форумом позвонить и показать результат? - person Vahe Galstyan; 12.04.2018
comment
проблема заключается в слаге, я думаю, что это ошибка в коде, как если бы я удалил этот код и изменил URL-адрес на localhost/forum/thread/thread=1, он отлично работает. проблема, похоже, заключается в том, чтобы получить слаг из FK в URL-адрес - person detinu20; 12.04.2018
comment
Является ли slug фактическим атрибутом или просто чем-то, что вы навязываете? - person Mfoo; 12.04.2018
comment
slug - это столбец таблицы форумов, который я пытаюсь получить с помощью localhost/forum/{forum.slug}/thread={thread.id}, на данный момент я могу получить только localhost/forum/-/thread={thread.id} - person detinu20; 12.04.2018

Может попробовать $thread->forums()->setAttribute('slug', $slug)

person Mfoo    schedule 12.04.2018

Итак, похоже, что id не является параметром маршрута.

ваш метод контроллера должен быть

public function show($slug)
{
    $thread = Thread::find(request()->input('id'));
    $thread->forums()->slug = $slug;

   return view('forum.thread')->withThread($thread);
}

либо так, либо меняй маршрут

person lucidlogic    schedule 12.04.2018
comment
Find(id) находит идентификатор потока, который я показываю, и правильно добавляет его к URL-адресу, thread={id} проблема связана с слагом, который является форумом, например форумом кодирования, поэтому маршрут должен показывать localhost/forum /кодирование/поток=1. но у меня проблема с отображением кода кода там - person detinu20; 12.04.2018
comment
Я бы лично изменил маршрут на /forum/{slug}/{thread_id} - person lucidlogic; 12.04.2018
comment
каким должен быть код контроллера, чтобы заставить это работать? - person detinu20; 12.04.2018