我有一个博客,希望在向公众展示时包括用户名。
创建博客时,请确保在user_id
中包含blogs table
在我的Blog模型中,我具有以下内容:
public function users()
{
return $this->belongsTo(User::class);
}
在我的用户模型中,我有:
public function blogs()
{
return $this->hasMany(Blog::class);
}
在我的Blog Controller中,我有:
public function index(User $user)
{
$users = User::get();
$blogs= DB::table('blogs')->where('user_id', '=', $users->id)->orderBy('id', 'DESC')->paginate(6);
return view('blogs.index',compact('blogs'));
}
然后在我看来:
@foreach($blogs as $blog)
<h1>{{$blog->title}}</h1>
Source:{{$blog->users->first_name}} // This does not work
Source:{{$blog->first_name}} // This does not work either
@endforeach
我想我可以做这样的事情来显示名字:
{{ $blogs->users->first_name }} {{ $blogs->users->last_name }}
但这也不起作用...
答案 0 :(得分:2)
在Blog控制器中,变量$blog
必须为$blogs
。刀片中也有多余的字符(右括号)。应该是:
@foreach($blogs as $blog)
Source: {{ $blog->user->first_name }}
...
@endforeach
博客模型
此函数替换了旧的“用户”函数,因为只返回了一个用户(belongsTo是单数关系)。
class Blog extends Model
{
public function user()
{
return $this->belongsTo('App\User');
}
}
用户模型
public function blogs()
{
return $this->hasMany('App\Blog');
}
控制器功能
因此,您可以减少控制器代码,包括删除冗余元素。
public function index(User $user)
{
$blogs = Blog::where('user_id', '=', $user->id)->orderBy('created_at','desc')->paginate(6);
return view('blogs.index', compact('blogs'));
}
答案 1 :(得分:2)
尝试一下:
@foreach($blogs as $blog)
<h1>{{$blog->title}}</h1>
{{$blog->user->first_name}}
@endforeach
在您的Blog模型上
public function user()
{
return $this->belongsTo(User::class);
}
答案 2 :(得分:1)
您做的方法称为查询生成器
$blogs= DB::table('blogs')->where('user_id', '=', $users->id)->orderBy('id', 'DESC')->paginate(6);
Query Builder不支持延迟加载,因为仅Eloquent方法支持延迟加载
$blog->users->first_name
对于雄辩的方式,您可以尝试以下方法:
$blogs = Blog::where('user_id', $user->id)->get()
foreach($blogs as $blog){
dd($blog->user); // you will get the user detail here
}
对于延迟加载,在加载大量数据时会遇到性能问题,因此可以使用此功能来防止延迟加载
$blogs = Blog::with('user')->where('user_id', $user->id)->get()
有关更多信息,请参见Eloquent Relationship Documentation
对于查询生成器来说,链接用户的唯一方法是使用连接,它将是类似的
$blogs = DB::table('blogs')
->join('users', 'users.id', '=', 'blogs.user_id')
->get();
foreach($blogs as $blog){
dd($blog->first_name) // user first name
}
有关更多信息,请参见Query Builder Join
答案 3 :(得分:1)
BlogController.php
public function index(){
$blogs = Blog::with('user')->get();
return view('blogs.index')->with('blogs',$blogs);
}
Blog.php
public function user()
{
return $this->belongsTo('App\User');
}
User.php
public function blogs()
{
return $this->hasMany('App\Blog');
}