我在将SQL查询转换为laravel查询时遇到问题。我想加入两个表users
和messages
,这样我就可以获得与其他用户进行对话的用户。
数据库结构:
消息:
这是我的SQL查询,我得到了我想要的东西:
SELECT u.id, c.id, u.first_name, u.last_name FROM messages c, users u
WHERE (CASE WHEN c.user_one = @USERID THEN c.user_two = u.ID WHEN c.user_two = @USERID THEN c.user_one= u.id END )
AND ( c.user_one = @USERID OR c.user_two = @USERID ) Order by c.id DESC Limit 20
这是我的Laravel查询:
DB::table('messages')
->join('users', function($join) use ($user_id) {
$join->select(DB::raw('CASE WHEN messages.user_one = ' . $user_id . ' THEN messages.user_two = ' . $user_id . 'WHEN messages.user_two = ' . $user_id . ' THEN messages.user_one = ' . $user_id));
$join->on(function($query) use ($user_id)
{
$query->where('messages.user_one', '=', $user_id);
$query->orWhere('messages.user_two', '=',$user_id);
});
})
->select('users.*', 'messages.*')
->get();
答案 0 :(得分:2)
<强>更新强> 抱歉,我的原始答案不是以安全的方式注入变量。请使用它来在原始查询中安全地注入变量。
原始语句中的SQL注入安全性。
在原始查询中,我们需要记住将所有变量传递给我们的mysql 数据库使用提供的第二个参数。
在您的情况下,您只需放置问号占位符,您希望在其中注入变量,然后将变量与您的第二个参数数组中的占位符放在一起。
来源:http://s4.jeffsbio.co.uk/laravel-5-query-builder-where-raw-2
更新了查询: -
DB::table('messages as m')
->join('users as u',function($join){
$join->on('u.id','=','m.user_one')
->orOn('u.id','=','m.user_two');
})
->where(function($query) use($user_id){
$query->where('m.user_one','=',$user_id);
$query->orWhere('m.user_two','=',$user_id);
})
->where(function($query) use($user_id){
$query->whereRaw(
'CASE WHEN m.user_one = ?'.
' THEN m.user_two = u.id'.
' WHEN m.user_two = ?'.
' THEN m.user_one = u.id END',[$user_id,$user_id]);
//here we passed the variables in exact order of their usage in query
})
->select('u.id as user_id', 'm.id as messages_id','u.first_name','u.last_name')
->orderBy('m.id','DESC')
->limit('20')
->get(
原始答案:
您不能像select
一样在join
子句中使用DB::table('messages as m')
->join('users as u',function($join){
$join->on('u.id','=','m.user_one')
->orOn('u.id','=','m.user_two');
})
->where(function($query) use($user_id){
$query->where('m.user_one','=',$user_id);
$query->orWhere('m.user_two','=',$user_id);
})
->where(function($query) use($user_id){
$query->whereRaw(DB::raw(
'CASE WHEN m.user_one = '.$user_id.
' THEN m.user_two = u.id'.
' WHEN m.user_two = '.$user_id.
' THEN m.user_one = u.id END'));
})
->select('u.id as user_id', 'm.id as messages_id','u.first_name','u.last_name')
->orderBy('m.id','DESC')
->limit('20')
->get();
子句。
使用: -
BREAK