Не корректно отображается дата создания поста Laravel

Пытаюсь вывести в шаблоне дату создания поста {{$blog->created_at->diffForHumans()}}, дата выводится, но во всех постах одинаковая. А именно дата регистрации юзера, который пост запилил.

Такой контроллер

public function show($id)
{
    $blog = Blog::join('users','author_id','=','users.id')->find($id);

    if(!$blog) {
        return redirect()->route('post.index')->with('success', 'Ты дурак?');
    }
    return view('posts.blog_show', compact('blog'));
}

Я так понял поле created_at он у меня тянет с таблицы users, а как мне сделать, что бы тянуло с таблицы blogs?


Ответы (1 шт):

Автор решения: Romka

Проблема в том, что при джойне одинаковые поля перезатираются.

То есть после запроса модель будет содержать данные обоих таблиц(toArray):

Array
(
    [id] => 1
    [title] => first
    [author_id] => 1
    [created_at] => 2010-02-02
    [name] => petya
)

поле created_at будет взято из присоединенной таблицы.

Самый простой способ решить проблему - явно указать какие поля нужны:

Blog::query()->select(['blogs.*', 'users.name'])->join('users','author_id','=','users.id')->find(1);

Тогда результат будет следующий(toArray):

Array
(
    [id] => 1
    [title] => first
    [author_id] => 1
    [created_at] => 2020-02-02
    [name] => petya
)

created_at - из таблицы blogs.

Этот способ не очень гибкий, так как каждый раз когда вам понадобиться новое поле пользователя, придется редактировать запрос.


Более верный способ - использовать Relationships

Для этого нужно объявить связь в модели Blog:

public function author(): BelongsTo
{
    return $this->belongsTo(User::class);
}

Запрос значительно упростится:

Blog::query()->with('author')->find(1)

Результат будет таким(toArray):

Array
(
    [id] => 1
    [title] => first
    [author_id] => 1
    [created_at] => 2020-02-02
    [author] => Array
        (
            [id] => 1
            [name] => petya
            [created_at] => 2010-02-02
        )

)

И никаких конфликтов имен не будет.

→ Ссылка