因此,我在弄清楚如何进行提要式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

joincomments表运行相同的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/

10-13 09:14