Php 将分页添加到关系并获取关系';s关系-拉威尔

Php 将分页添加到关系并获取关系';s关系-拉威尔,php,laravel,Php,Laravel,我正在使用Laravel和Vue建立一个论坛网站 我有三个表:论坛、帖子和用户。 一个论坛可以有多个帖子,每个帖子都有一个创建帖子的用户 当用户点击一个论坛时,我想用paginate方法显示这个论坛最近的10篇文章 Forum.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; clas

我正在使用Laravel和Vue建立一个论坛网站

我有三个表:论坛、帖子和用户。 一个论坛可以有多个帖子,每个帖子都有一个创建帖子的用户

当用户点击一个论坛时,我想用paginate方法显示这个论坛最近的10篇文章

Forum.php

<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Forum extends Model {
    use HasFactory;

    protected $table = 'forums';
    protected $guarded = [];

     /**
      * Get the forum posts
      * @return \Illuminate\Database\Eloquent\Relations\HasMany
      */
    public function posts() {
        return $this->hasMany(Post::class)->orderBy('created_at', 'DESC');
    }
}
<?php
namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Post extends Model {
    use HasFactory;

    protected $table = 'posts';
    protected $guarded = [];

    /**
     * Get the post's user
     * @return \Illuminate\Database\Eloquent\Relations\BelongsTo
     */
    public function user() {
        return $this->belongsTo(User::class);
    }
}
<?php
namespace App\Models;

use Illuminate\Contracts\Auth\MustVerifyEmail;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Foundation\Auth\User as Authenticatable;
use Illuminate\Notifications\Notifiable;

class User extends Authenticatable {
    use HasFactory, Notifiable;

    /**
     * The attributes that should be hidden for arrays.
     *
     * @var array
     */
    protected $hidden = [
        'password',
        'remember_token',
    ];

    /**
     * The attributes that should be cast to native types.
     *
     * @var array
     */
    protected $casts = [
        'email_verified_at' => 'datetime',
    ];

    /**
     * Get the user posts
     * @return \Illuminate\Database\Eloquent\Relations\HasMany
     */
    public function posts() {
        return $this->hasMany(Post::class);
    }
}
<?php
namespace App\Services;

use App\Models\Forum;

class ForumService {
    public static function getForumPosts($forumId) {
        $forum = Forum::with('posts.user')->find($forumId);
        dd($forum);
    }
}
<?php
namespace App\Services;

use App\Models\Forum;

class ForumService {
    public static function getForumPosts($forumId) {
        $forum = Forum::with(
            [
                'posts' => function ($query) { // How do I get the post user?
                    return $query->paginate(10);
                }
            ]
        )->find($forumId);
        dd($forum);
    }
}

只需在您创建的函数的查询范围内添加
with
方法

 $forum = Forum::with(
            [
                'posts' => function ($query) {
                    // returns posts with user  
                    return $query->with('user')->paginate(10);
                }
            ]
        )->find($forumId);

现在,您可以使用
$forum->posts[0]->user
访问第一个用户,该用户不会查询数据库,但会预取用户并将其填充到paginator集合中。

由于您已经拥有论坛的id,因此您只能检索属于该
论坛的帖子并按如下方式分页

 public static function getForumPosts($forumId) {
    return Forum::find($forumId)->posts()->paginate(10);
}
public static function getForumPosts($forumId) {
    return Forum::find($forumId)->posts()->with(['user'])->paginate(10);
}
如果您想加载
Post
creator,可以这样执行

 public static function getForumPosts($forumId) {
    return Forum::find($forumId)->posts()->paginate(10);
}
public static function getForumPosts($forumId) {
    return Forum::find($forumId)->posts()->with(['user'])->paginate(10);
}