因此,我在弄清楚如何进行提要式mysql调用时遇到了一些麻烦,并且我不知道它是 Eloquent 问题还是mysql的问题。我相信这两种方法都是可行的,我只需要一些帮助。
因此,我有一个用户,他们进入了供稿页面,该页面上显示了好友的信息(好友投票,好友评论,好友状态更新)。所以说我有汤姆,蒂姆和泰勒作为我的 friend ,我需要得到他们的所有票,评论,状态更新。我该怎么办?我具有按ID号列出的所有 friend 的列表,并且对于每个事件(投票,注释,状态更新)都有一个表,这些表中都存储有ID以链接回用户。因此,如何立即获取所有这些信息,以便可以将其显示在Feed中。
蒂姆评论“酷”
泰勒·赛义德(Taylor Said)“真要更新状态!
泰勒被评选为“有史以来最佳比赛”
编辑@damiani
因此,在完成模型更改后,我得到了这样的代码,并且它确实返回了正确的行
$friends_votes = $user->friends()->join('votes', 'votes.userId', '=', 'friend.friendId')->orderBy('created_at', 'DESC')->get(['votes.*']);
$friends_comments = $user->friends()->join('comments', 'comments.userId', '=', 'friend.friendId')->orderBy('created_at', 'DESC')->get(['comments.*']);
$friends_status = $user->friends()->join('status', 'status.userId', '=', 'friend.friendId')->orderBy('created_at', 'DESC')->get(['status.*']);
但是我希望它们全部一次发生,这是因为mysql按顺序对数千条记录进行排序比使用3个列表的php快100倍,将它们合并然后执行。有任何想法吗?
最佳答案
我确定还有其他方法可以完成此操作,但是一种解决方案是通过查询生成器使用join
。
如果您的表设置如下:
users
id
...
friends
id
user_id
friend_id
...
votes, comments and status_updates (3 tables)
id
user_id
....
在您的用户模型中:
class User extends Eloquent {
public function friends()
{
return $this->hasMany('Friend');
}
}
在您的 friend 模型中:
class Friend extends Eloquent {
public function user()
{
return $this->belongsTo('User');
}
}
然后,要收集ID为1的用户 friend 的所有票,可以运行以下查询:
$user = User::find(1);
$friends_votes = $user->friends()
->with('user') // bring along details of the friend
->join('votes', 'votes.user_id', '=', 'friends.friend_id')
->get(['votes.*']); // exclude extra details from friends table
对
join
和comments
表运行相同的status_updates
。如果希望将投票,评论和status_updates放在一个按时间顺序排列的列表中,则可以将结果三个集合合并为一个,然后对合并的集合进行排序。编辑
要在一个查询中获得选票,评论和状态更新,您可以构建每个查询,然后合并结果。不幸的是,如果我们使用 Eloquent
hasMany
关系(对于该问题的讨论,请使用see comments for this question)似乎不起作用,所以我们必须修改为使用where
的查询:$friends_votes =
DB::table('friends')->where('friends.user_id','1')
->join('votes', 'votes.user_id', '=', 'friends.friend_id');
$friends_comments =
DB::table('friends')->where('friends.user_id','1')
->join('comments', 'comments.user_id', '=', 'friends.friend_id');
$friends_status_updates =
DB::table('status_updates')->where('status_updates.user_id','1')
->join('friends', 'status_updates.user_id', '=', 'friends.friend_id');
$friends_events =
$friends_votes
->union($friends_comments)
->union($friends_status_updates)
->get();
不过,在这一点上,我们的查询有点麻烦,因此与和一个额外的表(如下面的DefiniteIntegral建议)建立多态关系可能是一个更好的主意。
关于php - Laravel Eloquent 加入与内部加入?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25984226/