如何在Laravel中创建用户和帖子之间的关系

时间:2019-01-21 23:11:32

标签: php laravel

我有一个博客,希望在向公众展示时包括用户名。

创建博客时,请确保在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 }}

但这也不起作用...

4 个答案:

答案 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');
}