После отправки переменной, содержащей комментарии к представлению, я могу отображать только идентификатор пользователя. Вот почему мне нужно каким-то образом пропустить все комментарии и на основе их user_id добавить новое значение пары ключей с именем пользователя и затем отправить его в представление. К сожалению, я не понимаю, как это сделать.
public function specificImage($id){
$similarImages = null;
$image = Image::with('comments.user')->find($id);
$subImages = Image::where('parent_id', $id)->get();
$views = $image->views;
$image->views = $views + 1;
$image->save();
$authorId = $image->user_id;
$author = User::find($authorId);
$comments = Comment::where('image_id', $id)->get();
$recentImages = Image::where('parent_id', NULL)->where('user_id', $authorId)->orderBy('created_at', 'desc')->limit(9)->get();
$tag = Tag::whereHas('images', function($q) use ($id) {
return $q->where('taggable_id', $id);
})->first();
if (!empty($tag)) {
$tagId = $tag->id;
}
if (!empty($tagId)) {
$similarImages = Image::where('parent_id', NULL)->whereHas('tags', function($q) use ($tagId) {
return $q->where('tag_id', $tagId);
})->orderBy('created_at', 'desc')->limit(9)->get();
}
return view('specificImage', ['image' => $image,'subImages' => $subImages, 'recentImages' => $recentImages, 'similarImages' => $similarImages, 'author' => $author, 'comments' => $comments]);
}
Стол:
Table: Comments
Columns: id, user_id, image_id, comment
Модель изображения:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Image extends Model
{
public function user(){
return $this->belongsTo('App\User');
}
public function tags(){
return $this->morphToMany('App\Tag', 'taggable');
}
public function votes(){
return $this->hasMany('App\Vote');
}
public function comments(){
return $this->hasMany('App\Comment');
}
public function updateVotes()
{
$this->upvotes = Vote::where('image_id', $this->id)->where('vote', true)->count();
$this->downvotes = Vote::where('image_id', $this->id)->where('vote', false)->count();
$this->save();
}
public function updateComments()
{
$this->comments = Comment::where('image_id', $this->id)->count();
$this->save();
}
}
Модель комментария:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Comment extends Model
{
public function image(){
return $this->belongsTo('App\Image');
}
public function user(){
return $this->belongsTo('App\User');
}
}
Модель пользователя:
<?php
namespace App;
use Illuminate\Contracts\Auth\Authenticatable;
use Illuminate\Database\Eloquent\Model;
class User extends Model implements Authenticatable
{
use \Illuminate\Auth\Authenticatable;
public function images(){
return $this->hasMany('App\Image');
}
public function comments(){
return $this->hasMany('App\Comment');
}
public function votes(){
return $this->hasMany('App\Vote');
}
public function roles(){
return $this->belongsToMany('App\Role', 'role_user', 'user_id', 'role_id');
}
public function hasAnyRole($roles) {
if (is_array($roles)) {
foreach ($roles as $role) {
if ($this->hasRole($role)){
return true;
}
}
} else {
if ($this->hasRole($roles)){
return true;
}
}
return false;
}
public function hasRole($role){
if ($this->roles()->where('name', $role)->first()){
return true;
}
return false;
}
}
Лезвие
@extends('layouts.app')
@section('content')
<div class = "specific-image-flexbox">
<div class = "specific-image-column">
<div class='specific-image-container'>
<img class='specific-image' src='{{url("storage/uploads/images/specificImages/".$image->file_name)}}' alt='Random image' />
@foreach($subImages as $subImage)
<img class='specific-image' src='{{url("storage/uploads/images/specificImages/".$subImage->file_name)}}' alt='Random image' />
@endforeach
</div>
</div>
<div class = "artwork-info-column">
<div class = "artwork-info-container">
<p class='title'>{{ $image->name }}<p>
<p class='author'>на<a href='{{url("profile/".$author->username )}}'><span class='usernameA artwork-info-username-span'>{{$author->username}}</span></a><img class='artwork-info-profile-picture' src='{{url("storage/uploads/profile_pictures/edited/".$author->profile_picture)}}'></p>
@if (Auth::user())
@if (Auth::id() === $image->user_id || Auth::user()->hasRole('Admin'))
<a class='placeholderDelete' href='{{ route('deleteImage', ['image_id' => $image->id]) }}'><i class = "far fa-trash-alt"></i> Изтрий изображението</a>
@endif
@endif
<p class='description'>{{ $image->description }}</p>
<p class='description'>Техника: {{ $image->medium }}</p>
<p><i class = "far fa-eye"></i> {{ $image->views }} Преглеждания</p>
<p><i class = "far fa-thumbs-up"></i> {{ $image->upvotes }} Харесвания</p>
<p class='commentsCount'><i class = "far fa-comments"></i> {{ $image->comments }} Коментари</p>
<a class='downloadImage' href = "{{url("storage/uploads/images/specificImages/".$image->file_name)}}" download = "{{ $image->name }}"><i class = "fas fa-file-download"></i> Изтегли</a>
<!--<a class='placeholderDelete fas fa-expand' href='{{url("storage/uploads/images/specificImages/".$image->file_name)}}'></a>-->
<div class='social-container'>
<div class = "addthis_inline_share_toolbox"
data-url = "{{ url()->full() }}"
data-title = "{{ $image->name }} by {{ $author->username }}"
data-description = "{{ $image->description }}"
data-media = "{{url("storage/uploads/images/specificImages/".$image->file_name)}}">
</div>
</div>
@if (!empty($recentImages))
@if (count($recentImages) >= 9)
<p class='author'>Още произведения на<a href='{{url("profile/".$author->username )}}'><span class='usernameA artwork-info-username-span'>{{$author->username}}</span></a><img class='artwork-info-profile-picture' src='{{url("storage/uploads/profile_pictures/edited/".$author->profile_picture)}}'></p>
<div class = "more-images-container">
@foreach($recentImages as $recentImage)
<div class = "more-images-container-element">
<a href='{{url("image/".$recentImage->id)}}'>
<img class='more-images' src='{{url("storage/uploads/images/miniImages/".$recentImage->file_name)}}' alt='Random image' />
</a>
</div>
@endforeach
</div>
@endif
@endif
@if (!empty($similarImages))
@if (count($similarImages) >= 9)
<p class='similar-images'>Подобни произведения</p>
<div class = "similar-images-container">
@foreach($similarImages as $similarImage)
<div class = "similar-images-container-element">
<a href='{{url("image/".$similarImage->id)}}'>
<img class='more-images' src='{{url("storage/uploads/images/miniImages/".$similarImage->file_name)}}' alt='Random image' />
</a>
</div>
@endforeach
</div>
@endif
@endif
@auth
<div class='postComments'>
<form method='POST' action=''>
<textarea class='comment-section' name='comment'></textarea>
<input type = "hidden" name = "user_id" value = "{{ Auth::user()->id }}">
<input type = "hidden" name = "image_id" value = "{{ $image->id }}">
<button class='postComment submit' type='submit' name='commentSubmit'>Изпрати</button>
</form>
</div>
@endauth
<div class='comments'>
@foreach($image->comments as $comment)
{{ $comment->user->username }}
@endforeach
</div>
</div>
</div>
</div>
<script>
var token = '{{ Session::token() }}';
var urlComment = '{{ route('comment') }}';
var urlLike = '{{ route('vote') }}';
</script>
@endsection
Я добавил свои модели.






Я бы посоветовал также добавить связь user к вашей модели Comment:
class Comment extends Model
{
public function image()
{
return $this->belongsTo('App\Image');
}
public function user()
{
return $this->belongsTo('App\User');
}
}
Затем вы можете нетерпеливый груз отношения, а затем получить к ним доступ в своем файле лезвия:
public function specificImage($id)
{
$image = Image::with('comments.user')->find($id);
return view('specificImage', ['image' => $image]);
}
Тогда в вашем файле лезвия у вас будет что-то вроде:
@foreach($image->comments as $comment)
{{ $comment->user->username }}
@endforeach
Кажется, я получаю ошибку "" Недопустимый аргумент для foreach () (View: C: \ MAMP \ htdocs \ Art Showcase \ resources \ views \ specificImage.blade.php) "" при попытке этого
@Bobimaru Какую версию Laravel вы используете? Вы добавили весь код для вашей модели Image и Comment в свой вопрос?
Да, я добавил отношения к своим моделям. {{App :: VERSION ()}} показывает, что я использую 5.5.41
@Bobimaru Значит, в ваших моделях нет других методов?
Да, но я удалил те, которые не связаны между собой, для лучшей читаемости. Я обновлю свой пост всеми методами (если по какой-то причине неуместный метод вызывает эту проблему)
Я добавил свои текущие живые модели с изменениями
В этом случае я действительно не уверен, почему он выбрасывает это исключение с кодом, который я предоставил в своем ответе. Даже если у вас нет комментариев, прикрепленных к изображению, отношение должно возвращать коллекцию, что не вызовет проблемы с foreach. Не могли бы вы добавить лезвие к своему вопросу, так как это может быть что-то еще, что вызывает проблему.
Хммм почему-то я вижу ваши ответы с огромным опозданием. В любом случае я обновил код, но он буквально такой же, как и то, что вы написали.
@Bobimaru Это весь твой файл с клинком?
О нет, я загрузил все это.
@Bobimaru Вы уверены, что передаете $subImages, $recentImages и $similarImages со своего контроллера? Если да, то если удалить цикл foreach $image->comments, избавится ли он от ошибки?
Удалив foreach, ошибка исчезнет. Я передаю $ subImages, $ RecentImages и $ SimilarImages из своего контроллера. Я обновил свой код, в котором я передаю переменные, чтобы вы могли их видеть.
@Bobimaru Единственное, что я могу предложить, это заменить `$ image = Image :: with ('comments.user') -> find ($ id);` на `$ image = Image :: with ('comments.user') -> findOrFail ($ id); `Если страница все еще работает, я не знаю, что еще я могу предложить.
К сожалению, это ничего не дало: |
Установлены ли у вас отношения между моделями, то есть отношения комментариев в
Imageи отношения пользователей вComment?