Laravel Associate method is returning empty array in the view

前端 未结 3 1098
无人共我
无人共我 2021-01-15 12:12

I am working on a simple social network, i am working on the replies section now. I associated the post/status model with user as below, but when i tried to access in the vi

相关标签:
3条回答
  • 2021-01-15 12:54

    You are using $post for both the parent post and the reply, hence in

    $post->replies()->save($post);
    

    you are actually setting $post to be a reply to itself.

    Would also be worth noting that column id is UNSIGNED but user_id and parent_id are not. I presume that there are foreign keys set on these?

    Edit

    Try this with a new $reply variable.

    public function postReply(Request $request, $statusId){
        $this->validate($request, [
            "reply-{$statusId}" => 'required|max:1000',
        ],
        [
            'required' => 'The reply body is required'
        ]
        );
    
        $post = Post::notReply()->find($statusId);
        if(!$post){
            return redirect('/');
        }
    
        if(!Auth::user()->isFriendsWith($post->user) && Auth::user()->id !== $post->user->id){
            return redirect('/');
        }
    
        $reply = Post::create([
            'body' => $request->input("reply-{$statusId}"),
        ]);
        $reply->user()->associate(Auth::user());
        $post->replies()->save($reply);
    
    
        return redirect()->back();
    }
    
    0 讨论(0)
  • 2021-01-15 13:01

    It seems like your are not attaching the replies to your $post variable while passing it to your view.
    We have to use with() method to join these two tables.
    Try, the following :

    if(Auth::check()){ 
                $posts = Post::notReply()
                        ->where(function($query){ 
                            return $query->where('user_id', Auth::user()->id)
                                    ->orWhereIn('user_id', Auth::user()->friends()->lists('id'));
                        })
                        ->with('replies')//Here we are joining the replies to the post
                        ->orderBy('created_at', 'desc')
                        ->get();
                        return view('timeline.index', compact('posts')); 
                    }
    

    Now, in your View you would need to use 2 foreach loop like below:

    @foreach($posts as $post)
        {{--Your Code --}}
        @foreach($post->replies as $reply)
            {{--Your Code --}}
        @endforeach
        {{--Your Code --}}
    @endforeach
    

    Update:

    Problem is with the postReply() method. In old code you were overriding the $post variable, due to which the reply was getting parent_id as its own id.
    So, replace your old code with using $reply variable.
    old:

    $post= Post::create([
       'body' => $request->input("reply-{$statusId}"),
    ]);
    $post->user()->associate(Auth::user());
    $post->replies()->save($post);
    

    new:

    $reply = Post::create([
       'body' => $request->input("reply-{$statusId}"),
    ]);
    $post->user()->associate(Auth::user());
    $post->replies()->save($reply);
    
    0 讨论(0)
  • 2021-01-15 13:13

    You have setup your relations wrong. In your post model, instead of post having a self one-to-many relationship. It should be like this:

    // App\User.php
    public function replies()
    {
        return $this->hasMany(App\Reply::class);
    }
    
    // App\Post.php
    public function replies()
    {
        return $this->hasMany(App\Reply::class);
    }
    
    // App\Reply.php
    public function post()
    {
        return $this->belongsTo(App\Post::class);
    }
    
    public function user()
    {
        return $this->belongsTo(App\User::class);
    }
    
    public function comments()
    {
        return $this->belongsTo(App\Reply::class, 'parent_id');
    }
    
    0 讨论(0)
提交回复
热议问题