LARAVEL Eloquent: ссылка на пользователя, затем пользователь на профиль

Я стремлюсь получить изображение пользователя (из столбца таблицы профиля ‘profile_img’) и отобразить его в нижнем колонтитуле каждого сообщения.

Я могу получить имя автора, используя $post->author->name и изображение профиля с помощью $post->author->profile->profile_image но это работает только тогда, когда у меня есть одна запись (сообщение). когда появляется более одной записи, я получаю сообщение об ошибке Попытка получить свойство ‘profile’ для необъекта (View: xampp /………./ home.blade.php)

Может кто-нибудь показать мне, где я могу пойти не так?

Модели:

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

public function post()
{
return $this->hasMany('App\Post');
}
public function profile()
{
return $this->hasOne('App\Profile');
}

Профиль

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

Сообщение

public function author()
{
return $this->belongsTo('App\User', 'id');
}

контроллер

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class MainController extends Controller
{
public function index() {
$posts = Post::paginate(9);

return view('pages.home')->with('posts', $posts);
}

домашний вид

@if(count($posts) > 0)
@foreach($posts as$posts)
<div>
<div class="post-title"><h3>{{$post->title}}</h3></div>
<div class="post-description">
{!!mb_substr($post>body,10,rand(35,40)) !!} ....
</div>
<div class="featured-details">
<div class="p-clearfix">
<img class="authorimg"src="/storage/profile_images/{{ $post->author->profile->profile_image }}">
<div class="author-title lite">{{ $post->author->name }}</div>
<div class="lite thumbnail-date">{{ date('M j, Y', strtotime($post->created_at)) }}</div>
</div>
</div>
</div>
<hr>
@endforeach

@else
no post yet
@endif

0

Решение

Кажется, есть некоторые проблемы в вашем домашнем представлении. Попробуйте еще раз с этим кодом и посмотрите.

Home View

@if(count($posts) > 0)
@foreach($posts as $post)
<div>
<div class="post-title"><h3>{{$post->title}}</h3></div>
<div class="post-description">
{!!mb_substr($post>body,10,rand(35,40)) !!} ....
</div>
<div class="featured-details">
<div class="p-clearfix">
<img class="authorimg"src="/storage/profile_images/{{ $post->author->profile->profile_image }}">
<div class="author-title lite">{{ $post->author->name }}</div>
<div class="lite thumbnail-date">{{ date('M j, Y', strtotime($post->created_at)) }}</div>
</div>
</div>
</div>
<hr>
@endforeach

@else
no post yet
@endif

Вы даже можете пойти дальше и избежать проблемы n + 1 для авторов, выполнив свой красноречивый модельный запрос, подобный этому, ваш контроллер

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Post;

class MainController extends Controller
{
public function index() {
$posts = Post::with("author")->paginate(9);

return view('pages.home')->with('posts', $posts);
}

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

0

Другие решения

В вашем методе index контроллера попробуйте с:

public function index() {
$posts = Post::with("author.profile")->paginate(9);

return view('pages.home')->with('posts', $posts);
}

И обновите пост-модель отношений:

public function author()
{
return $this->belongsTo('App\User', 'user_id'); // update to users table foreign key
}
0

По вопросам рекламы [email protected]