0

有人可以帮我解决这个问题。

用户

+------+---------------------+  
| id   | name                |  
+------+---------------------+  
| 1    | John                |  
| 2    | Jade                |    
| 3    | Robbert             |  
| 4    | Steve               |
+------+---------------------+

友谊

+------+---------------------+  
| uid  | friend_id           |  
+------+---------------------+  
| 1    | 2                   |  
| 1    | 3                   |    
| 2    | 4                   |  
+------+---------------------+
  1. 假设当前用户 id 为 1。
  2. 想得到当前用户好友的名字。( 他们都是 )
  3. 但是此代码仅返回它找到的每个朋友的当前用户名

对于上面的示例数据,输出是 : JohnJohn每一行都有一个。

$friends = DB::table('users')
->join('friendship', function($join)
{
    $join->on('users.id', '=', 'friendship.uid');
})
->where('friendship.blocked', '=', '0' )
->where('users.id', '=', '1' )
->get();

上面的 SQL 代码:

select * from `users`
    inner join `friendship` 
        on `users`.`id` = `friendship`.`uid` 
where `users`.`id` = 1
4

2 回答 2

2

你应该改变你的join状况。您正在以用户 ID 加入,并且您想在朋友方面加入:

select name from users
join friendship on users.id = friendship.friend_id 
where friendship.uid = 1

简而言之,你得到 2jhon是因为你有 2 个朋友,jhon但是你得到了这些数据的用户 ID 信息并且你想要朋友方面。

在这里拉小提琴。

于 2013-10-23T20:11:17.733 回答
1

可能不是您问题的确切答案,但您应该使用 Eloquent ORM 来做简单的事情,它可以是这样的:

class User extends Eloquent {

    public function friends()
    {
        return $this->hasMany('friendship', 'uid');
    }

} 

class Friendship extends Eloquent {

    public function user($query)
    {
        return $this->belongsTo('User', 'friend_id');
    }

    public function scopeBlocked($query)
    {
        return $query->where('blocked', '=', '0');
    }

    public function scopeNotBlocked($query)
    {
        return $query->where('blocked', '=', '1');
    }

} 

然后你只需要使用它:

$user = User::find(1);
$friends = $user->friends()->notBlocked()->get();

foreach($friends as $friend)
{
    echo $friend->user->name;
}
于 2013-10-23T20:30:41.473 回答