如何通过 laravel 查询获得具有相似兴趣的用户
how to get users having similar interests with laravel query
我有这个 sql 查询来获取至少有 3 个共同兴趣的用户。
$get_similar = $db->query(sprintf('SELECT ui.user_id, COUNT( * ) AS common_interests
FROM users_interests ui
WHERE ui.interests_id
IN (
SELECT ui2.interests_id
FROM users_interests ui2
WHERE ui2.user_id = %s
)
AND ui.user_id <> %s
GROUP BY ui.user_id
HAVING common_interests >2
', secure($this->_data['user_id']), secure($this->_data['user_id']) ));
如何将上述 sql 查询转换为 laravel eloquent 查询?
像这样的东西应该可以工作
$get_similar = \DB::raw('SELECT ui.user_id, COUNT( * ) AS common_interests
FROM users_interests ui
WHERE ui.interests_id
IN (
SELECT ui2.interests_id
FROM users_interests ui2')
->where('ui2.user_id','=', secure($this->_data['user_id']))
->where('ui.user_id','<>', secure($this->_data['user_id'])
->groupBy('ui.user_id')
->having('common_interests', '>', '2')_;
或完全 eloquent 版本(必须使用 DB 而不是模型,因为我不知道你的模型)
$get_similar = \DB::select('ui.user_id, COUNT( * ) AS common_interests')
->from('users_interests ui')
->whereIn('ui.interests_id', function($query) {
$query->select('ui2.interests_id')
->from('users_interests as ui2');
})
->where('ui2.user_id','=', secure($this->_data['user_id']))
->where('ui.user_id','<>', secure($this->_data['user_id'])
->groupBy('ui.user_id')
->having('common_interests', '>', '2')->get();
下面的查询就可以了
$user_interests = User::find($user_id)->interests->pluck('id')->toArray();
$get_similar = DB::table('users_interests')
->select(DB::raw('count(*) as common_interests, user_id'))
->whereIn('interest_id', $user_interests)
->where('user_id','<>', 3)
->groupBy('user_id')
->havingRaw('COUNT(*) > 2')
->get();
我有这个 sql 查询来获取至少有 3 个共同兴趣的用户。
$get_similar = $db->query(sprintf('SELECT ui.user_id, COUNT( * ) AS common_interests
FROM users_interests ui
WHERE ui.interests_id
IN (
SELECT ui2.interests_id
FROM users_interests ui2
WHERE ui2.user_id = %s
)
AND ui.user_id <> %s
GROUP BY ui.user_id
HAVING common_interests >2
', secure($this->_data['user_id']), secure($this->_data['user_id']) ));
如何将上述 sql 查询转换为 laravel eloquent 查询?
像这样的东西应该可以工作
$get_similar = \DB::raw('SELECT ui.user_id, COUNT( * ) AS common_interests
FROM users_interests ui
WHERE ui.interests_id
IN (
SELECT ui2.interests_id
FROM users_interests ui2')
->where('ui2.user_id','=', secure($this->_data['user_id']))
->where('ui.user_id','<>', secure($this->_data['user_id'])
->groupBy('ui.user_id')
->having('common_interests', '>', '2')_;
或完全 eloquent 版本(必须使用 DB 而不是模型,因为我不知道你的模型)
$get_similar = \DB::select('ui.user_id, COUNT( * ) AS common_interests')
->from('users_interests ui')
->whereIn('ui.interests_id', function($query) {
$query->select('ui2.interests_id')
->from('users_interests as ui2');
})
->where('ui2.user_id','=', secure($this->_data['user_id']))
->where('ui.user_id','<>', secure($this->_data['user_id'])
->groupBy('ui.user_id')
->having('common_interests', '>', '2')->get();
下面的查询就可以了
$user_interests = User::find($user_id)->interests->pluck('id')->toArray();
$get_similar = DB::table('users_interests')
->select(DB::raw('count(*) as common_interests, user_id'))
->whereIn('interest_id', $user_interests)
->where('user_id','<>', 3)
->groupBy('user_id')
->havingRaw('COUNT(*) > 2')
->get();