Я стремлюсь получить изображение пользователя (из столбца таблицы профиля ‘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
Кажется, есть некоторые проблемы в вашем домашнем представлении. Попробуйте еще раз с этим кодом и посмотрите.
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);
}
Надеюсь, это поможет.
В вашем методе 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
}