我正在构建一个小博客,我想使用内置的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。但我根本不想要这个帖子。
这可能吗? 在我的解释中我是否足够清楚?
由于
答案 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');
})