如何在 Eloquent 和 Blade 中显示带分页的相关项目?

How to show related items with pagination in Eloquent and Blade?

管理员控制器

public function index(){
    $someMessages=$this->blog->paginate(5);
    $users=User::all();
    // return 'Welcome Admin';
    return View::make('admin.admin',['someMessages'=>$someMessages,'users'=>$users]);
}

admin.blade.php
这里需要根据 'someMessages' 对象中存储的 uid 显示来自 'users' 变量的用户名。

@extends('layout.default')
@section('title')
    <title>Welcome Admin</title>
@stop

@section('content')
    @foreach($someMessages as $message) 
        <blockquote>{{$message['blog']}}
            <small>
                <cite>

                </cite>
            </small>
        </blockquote>
    @endforeach
{{ $someMessages->links()}}
@stop

如果正确定义了博客消息和用户之间的 Eloquent 关系,则无需单独查询用户。你想要做的就是进行预加载:

//in case you call it author in your "relation definition"
$someMessages = $this->blog->with('author')->paginate(5);

然后在您的 Blade 模板中:

@foreach($someMessages as $message) 
  <div>
    <div>{{ $message->blog }}</div>
    <div>{{ $message->author->name }}</div>
  </div>
@endforeach

如果您还没有宣布关系 - 很简单。打开你的用户 eloquent 模型 class 并添加一个方法:

public function blogs()
{
    return $this->hasMany('Blog', 'uid');
}

在博客 eloquent 模型中 class 您将添加:

public function author()
{
    return $this->belongsTo('User', 'uid');
}

有关 eloquent 和关系的更多信息,请参见 here

如果不是这种情况,您仍然可以过滤您的用户集合以获得您想要的:

@foreach($someMessages as $message)
<?php
  $user = $users->filter(function($user) use ($message)
  {
      return $user->id == $message->uid;
  })->first();
?>
  <div>
    <div>{{ $message->blog }}</div>
    <div>{{ $user->name }}</div>
  </div>
@foreach

这里发生的是你根据 $message->uid 值过滤你的用户集合并从中取出第一个(它应该总是只有一个或 none 因为用户 ID 是唯一的)。

尽管您需要了解,在这种情况下,您将从数据库中获取所有用户,并针对您输出的每条博客消息对他们进行过滤。在这里,预加载是一个更好的主意,如果可能的话,我会坚持使用它。