Я хочу отобразить имя пользователя владельца комментария, однако в таблице комментариев есть только user_id

После отправки переменной, содержащей комментарии к представлению, я могу отображать только идентификатор пользователя. Вот почему мне нужно каким-то образом пропустить все комментарии и на основе их 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

Установлены ли у вас отношения между моделями, то есть отношения комментариев в Image и отношения пользователей в Comment?

Rwd 09.09.2018 10:55

Я добавил свои модели.

Bobimaru 09.09.2018 11:06
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
2
94
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я бы посоветовал также добавить связь 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 09.09.2018 11:39

@Bobimaru Какую версию Laravel вы используете? Вы добавили весь код для вашей модели Image и Comment в свой вопрос?

Rwd 09.09.2018 11:55

Да, я добавил отношения к своим моделям. {{App :: VERSION ()}} показывает, что я использую 5.5.41

Bobimaru 09.09.2018 12:08

@Bobimaru Значит, в ваших моделях нет других методов?

Rwd 09.09.2018 12:50

Да, но я удалил те, которые не связаны между собой, для лучшей читаемости. Я обновлю свой пост всеми методами (если по какой-то причине неуместный метод вызывает эту проблему)

Bobimaru 09.09.2018 12:51

Я добавил свои текущие живые модели с изменениями

Bobimaru 09.09.2018 12:53

В этом случае я действительно не уверен, почему он выбрасывает это исключение с кодом, который я предоставил в своем ответе. Даже если у вас нет комментариев, прикрепленных к изображению, отношение должно возвращать коллекцию, что не вызовет проблемы с foreach. Не могли бы вы добавить лезвие к своему вопросу, так как это может быть что-то еще, что вызывает проблему.

Rwd 09.09.2018 13:54

Хммм почему-то я вижу ваши ответы с огромным опозданием. В любом случае я обновил код, но он буквально такой же, как и то, что вы написали.

Bobimaru 09.09.2018 14:37

@Bobimaru Это весь твой файл с клинком?

Rwd 09.09.2018 15:14

О нет, я загрузил все это.

Bobimaru 09.09.2018 15:17

@Bobimaru Вы уверены, что передаете $subImages, $recentImages и $similarImages со своего контроллера? Если да, то если удалить цикл foreach $image->comments, избавится ли он от ошибки?

Rwd 09.09.2018 15:22

Удалив foreach, ошибка исчезнет. Я передаю $ subImages, $ RecentImages и $ SimilarImages из своего контроллера. Я обновил свой код, в котором я передаю переменные, чтобы вы могли их видеть.

Bobimaru 09.09.2018 15:24

@Bobimaru Единственное, что я могу предложить, это заменить `$ image = Image :: with ('comments.user') -> find ($ id);` на `$ image = Image :: with ('comments.user') -> findOrFail ($ id); `Если страница все еще работает, я не знаю, что еще я могу предложить.

Rwd 09.09.2018 15:54

К сожалению, это ничего не дало: |

Bobimaru 09.09.2018 16:43

Другие вопросы по теме