如何加入这两个mysql表?

时间:2013-10-23 20:04:15

标签: mysql sql laravel laravel-4

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

用户

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

友谊

+------+---------------------+  
| uid  | friend_id           |  
+------+---------------------+  
| 1    | 2                   |  
| 1    | 3                   |    
| 2    | 4                   |  
+------+---------------------+
  1. 假设当前用户ID为1。
  2. 想要获取当前用户朋友的名字。(所有这些)
  3. 但此代码仅为其找到的每位朋友返回当前用户名
  4. 对于上面的示例数据,输出为:John,每行John。{/ p>

    $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
    

2 个答案:

答案 0 :(得分:2)

您应该更改join条件。您正在加入用户ID,并希望加入好友方:

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

简而言之,您获得了2 jhon,因为您有2位jhon的朋友,但您正在获取这些数据的用户ID信息,而您想要朋友方。

小提琴here

答案 1 :(得分: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;
}