有人可以帮我解决这个问题。
表用户
+------+---------------------+
| id | name |
+------+---------------------+
| 1 | John |
| 2 | Jade |
| 3 | Robbert |
| 4 | Steve |
+------+---------------------+
表友谊
+------+---------------------+
| uid | friend_id |
+------+---------------------+
| 1 | 2 |
| 1 | 3 |
| 2 | 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
答案 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;
}