雄辩的渴望加载充当显式连接

时间:2014-09-21 15:47:16

标签: php laravel laravel-4 eloquent eager-loading

我正在构建一个小博客,我想使用内置的Eloquent eager loading,但我希望它能够充当显式连接。

这是我尝试做的事情,使用了一个有效的联接,但不是我想要的方式。

$posts = Post::join('users', function($join){
    $join->on('users.id', '=', 'posts.user_id');
    $join->on('users.status', '=', DB::raw('active'));
})
->get();

我的问题是我无法在我的帖子中使用用户模型,如下所示:

  

$帖[0] - >用户>姓名;

通过联接,用户的数据直接在帖子模型上设置,所以我必须这样使用它:

  

$帖[0] - >姓名;

问题是:我想使用我的用户模型,因为它有一些我想要使用的方法。一个用于打印全名,一个用于打印其URL等。

我无法通过热切加载来防止帖子在没有用户连接的情况下加载。当与帖子相关联的用户没有状态“活动”时,我仍然会收到帖子,并为用户提供NULL。但我根本不想要这个帖子。

这可能吗? 在我的解释中我是否足够清楚?

由于

1 个答案:

答案 0 :(得分:1)

你的事情太复杂了。 Eloquent拥有您需要的一切:

// first make sure you load only posts of active users
$posts = Post::whereHas('user', function ($q) {
  $q->where('status', 'active');
})
// then eager load the users
->with('user')
->get();

通过这种方式,你在尝试中做了什么,在你的加入中(没有DB::raw):

$posts = Post::join('users', function($join){
    // on() is for comparing fields
    $join->on('users.id', '=', 'posts.user_id');

    // while where is for comparing to provided values/strings
    // just like simple query where()
    $join->where('users.status', '=', 'active');
})