Mysql 如何通过laravel查询获得兴趣相似的用户

Mysql 如何通过laravel查询获得兴趣相似的用户,mysql,sql,laravel,laravel-query-builder,Mysql,Sql,Laravel,Laravel Query Builder,我使用此sql查询来获取至少有3个共同兴趣的用户 $get_similar = $db->query(sprintf('SELECT ui.user_id, COUNT( * ) AS common_interests FROM users_interests ui WHERE ui.interes

我使用此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雄辩的查询?

类似的方法应该可以工作

$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')_;
或者完全雄辩的版本不得不使用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();

像这样的东西应该有用

$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')_;
或者完全雄辩的版本不得不使用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();

下面的查询就可以了

$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();

如果上述查询工作正常,则使用laravel raw执行上述查询。问题是我正在与一个团队一起处理项目,我们需要以最佳方式使用laravel。如果上述查询工作正常,然后使用laravel raw执行上述查询。问题是我正在与一个团队一起处理项目,我们需要以最佳方式使用laravel。不工作并不意味着任何事情。你会犯什么错误?不工作不意味着任何事情你会犯什么错误?