【问题标题】:how to get users having similar interests with laravel query如何通过 laravel 查询获得具有相似兴趣的用户
【发布时间】:2017-12-15 00:19:46
【问题描述】:

我有这个 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查询?

【问题讨论】:

  • 如果上述查询完美运行,则使用 laravel raw 执行上述查询。
  • 问题是我正在和一个团队一起做这个项目,我们需要以最好的方式使用 laravel。

标签: mysql sql laravel laravel-query-builder


【解决方案1】:

下面的查询可以解决问题

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

【讨论】:

    【解决方案2】:

    这样的东西应该可以工作

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

    【讨论】:

    • 不工作并不意味着你得到什么错误?
    猜你喜欢
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 2013-08-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多