Не корректно отображается дата создания поста 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 шт):
Проблема в том, что при джойне одинаковые поля перезатираются.
То есть после запроса модель будет содержать данные обоих таблиц(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
)
)
И никаких конфликтов имен не будет.