查询构建器不会在另一列

时间:2016-10-13 15:15:48

标签: laravel

对不起,我的问题标题不是很清楚,但我无法想出这个问题的方法。

我有以下查询构建器代码。

return self::select(DB::raw('sum(user_points.points) AS points, users.id AS user_id, users.username, users.avatar, users.firstname, users.lastname'))
            ->join('users', 'users.id', '=', 'user_points.user_id')
            $query->where('user_points.artist_id', 0)->orWhere('user_points.artist_id', 'users.favourite_artist_id');
            })
            ->where('user_points.created_at', '>=', $startDate)
            ->where('user_points.created_at', '<=', $endDate)
            ->groupBy('users.id')
            ->orderBy('points', 'DESC')
            ->orderBy('user_id', 'ASC')
            ->simplePaginate(100);

它运行正常,但忽略了内部查询,特别是它忽略了部分内容;

$query->where('user_points.artist_id', 0)->orWhere('user_points.artist_id', 'users.favourite_artist_id');
                })

它匹配的是&user; __ user.points =。 ; s与它处理绑定的方式有关?但我似乎找不到让它发挥作用的方法。

完整的查询应该像这样结束;

SELECT SUM(user_points.points) AS points, users.id AS user_id, users.username, users.avatar, users.firstname, users.lastname
            FROM user_points
            INNER JOIN users ON users.id = user_points.user_id
            WHERE (user_points.artist_id = 0 OR user_points.artist_id = users.favourite_artist_id)
              AND user_points.created_at >= '$startDate' AND user_points.created_at <= '$endDate'
            GROUP BY user_id
            ORDER BY points DESC, user_id ASC

我将查询构建器代码更新为此。

return self::select(DB::raw('sum(user_points.points) AS points, users.id AS user_id, users.username, users.avatar, users.firstname, users.lastname'))
            ->join('users', 'users.id', '=', 'user_points.user_id')
            ->where(function($query) {
                    $query->Where('user_points.artist_id', 0)->orWhere(DB::raw('user_points.artist_id = users.favourite_artist_id'));
            })
            ->where('user_points.created_at', '>=', $startDate)
            ->where('user_points.created_at', '<=', $endDate)
            ->groupBy('users.id')
            ->orderBy('points', 'DESC')
            ->orderBy('user_id', 'ASC')
            ->simplePaginate(100);

由于最终查询最终看起来像这样,因此无法正常工作。

select sum(user_points.points) AS points, users.id AS user_id, users.username, users.avatar, users.firstname, users.lastname 
from `user_points` inner join `users` on `users`.`id` = `user_points`.`user_id` where (`user_points`.`artist_id` = ? or user_points.artist_id = users.favourite_artist_id is null) 
and `user_points`.`created_at` >= ? 
and `user_points`.`created_at` <= ? 
group by `users`.`id` 
order by `points` desc, `user_id` asc

1 个答案:

答案 0 :(得分:1)

您需要将第二个位置(或)添加为原始查询。 where方法将第二列添加为值,以便您实际尝试以下操作:

user_points.artist_id = 'users.favourite_artist_id'

尝试以下方法:

whereRaw("user_points.artist_id = users.favourite_artist_id")
相关问题