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

时间:2015-02-03 07:34:45

标签: php laravel blade

AdminsController

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

1 个答案:

答案 0 :(得分:1)

如果您正确定义了博客消息和用户之间的雄辩关系,则无需单独查询用户。你想要做的只是热切的加载:

//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

如果你还没有宣布这种关系 - 这很容易。打开用户雄辩的模型类并添加方法:

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

在博客eloquent模型类中,您需要添加:

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

更多关于雄辩和关系的信息可以找到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值过滤您的用户集合并从中获取第一个(由于用户ID是唯一的,因此它应该始终只有一个或没有)。

虽然您需要了解在这种情况下,您将从数据库中获取所有用户,并为您输出的每个博客消息过滤它们。渴望加载是一个更好的主意,如果可能的话,我会坚持下去。