Laravel 5.1 - 使用eloquent查询数据透视表

时间:2015-07-11 08:58:19

标签: laravel eloquent laravel-5

我正在使用laravel 5.1进行CMS开发。我有一个简单的帖子结构,用户和用户都可以喜欢帖子。

帖子和用户有多对多的关系,并使用数据透视表来建立关系。

帖子模型

public function likedby()
{
    return $this->belongsToMany('App\Models\User','user_like_post')
        ->withTimestamps();
}

用户模型

public function likes(){
    return $this->belongsToMany('App\Models\Post','user_like_post')
        ->withTimestamps();
}

我想列出用户的最新活动。例如,

  1. 用户名1喜欢Post2
  2. 用户名5喜欢Post9
  3. 用户名30喜欢Post25
  4. 我知道我必须写一个像这样的SQL查询 -

    mysql > select users.name, posts.heading from user_like_post as ulp 
          > join users on ulp.user_id=users.id 
          > join posts on ulp.post_id=posts.id 
          > order by ulp.created_at desc limit 10;
    

    上面的查询工作正常但是有没有办法用laravel eloquent来做呢?

1 个答案:

答案 0 :(得分:2)

如果您需要纯粹的雄辩解决方案,那么您需要针对数据透视表的其他模型:

class PostUser extends Model {
  protected $table = 'user_like_post';
  public function post()
  {
    return $this->belongsTo(Post::class);
  }

  public function user()
  {
    return $this->belongsTo(User::class);
  }
}

// then something like this
$activity = PostUser::latest()->take(10)->get();

@foreach ($activity as $action)
  {{ $action->user->name }} likes {{ $action->post->title }}
@endforeach

除此之外,您需要joins才能按透视表对结果进行排序。