我将我的应用程序迁移到Laravel 4,但我陷入了一个非常重要的查询,Raw查询是这样的:
'select m.* from vn_mensagem m'
. ' INNER JOIN vn_mensagem_item i ON i.mensagem_id = m.mensagem_id '
. 'INNER JOIN vn_mensagem_destino d ON d.mensagem_id = m.mensagem_id '
. 'WHERE d.usuario_id = ' . $user->id . ' AND m.lida = 0 '
. 'AND i.data > "' . $timestamp . '" '
. 'group by d.mensagem_id '
. 'HAVING (count(i.mensagem_item_id) > 1 OR m.usuario_id != ' . $user->id . ')'
. 'ORDER BY i.data DESC'
我尝试使用Laravel Query Builder重现该查询,我得到了这个:
$mensagens = DB::table('mensagem')
->select('mensagem.*')
->join('mensagem_item', 'mensagem.mensagem_id', '=', 'mensagem_item.mensagem_id')
->join('mensagem_destino', 'mensagem.mensagem_id', '=', 'mensagem_destino.mensagem_id')
->where('mensagem_destino.usuario_id', $user->id)
->where('lida', 0)
->where('mensagem_item.data', '>', $timestamp)
->groupBy('mensagem_destino.mensagem_id')
->having(function($query) {
$query->where(DB::raw('count(mensagem_item.mensagem_item_id)'), '>', 1)
->orWhere('mensagem.usuario_id', '!=', $user->id);
})
->orderBy('mensagem_item.data', 'desc')->get();
但后来我收到了以下错误:
{"error":{"type":"ErrorException","message":"strtolower() expects parameter 1 to be string, object given","file":"\/var\/www\/laravel\/php\/vendor\/laravel\/framework\/src\/Illuminate\/Database\/Grammar.php","line":49}}
如何在Laravel Query Builder中的parenteses之间制作一个HAVING条件?
答案 0 :(得分:6)
having()
不接受回调,您可以使用havingRaw()
答案 1 :(得分:2)
你的问题在这里:
DB::raw('count(mensagem_item.mensagem_item_id)')
这将返回一个整数,而不是Laravel所期望的字段名字符串。
查看Illuminate / Database / Grammar.php,您可以看到查询是如何构建的。
您可能希望使用DB :: unrepared执行完全RAW查询。见这里:https://stackoverflow.com/a/17876877/146602