2014-01-29 80 views
4

我遷移我的應用程序Laravel 4,但我被困在一個非常重要的查詢,原始查詢的是:在Laravel查詢生成器parenteses有

'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查詢生成器,我得到這個:

$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查詢生成器中的小菜單之間做出HAVING條件嗎?

回答

6

having()不接受一個回調,您可以使用havingRaw()

+0

完美地工作,謝謝! – wiLLiamcastrO

2

你的問題是在這裏:

DB::raw('count(mensagem_item.mensagem_item_id)')

這將返回一個整數,而不是一個字段名字符串,這是什麼Laravel期待。

看看Illuminate/Database/Grammar.php,你可以看到如何構建查詢。

您可能想要使用DB :: unprepared做一個完全RAW查詢。在這裏看到:https://stackoverflow.com/a/17876877/146602

+0

什麼措手不及方法的語法?我無法在文檔中找到它,我嘗試了$ mensagens = DB :: unprepared('select ...');但是,我收到了錯誤:「在其他未緩衝的查詢處於活動狀態時無法執行查詢,請考慮使用PDOStatement :: fetchAll()。或者,如果您的代碼只是針對mysql運行,則可以通過設置PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY屬性「。 – wiLLiamcastrO

+0

請參閱以下API文檔:http://laravel.com/api/master/Illuminate/Database/MySqlConnection.html#method_unprepared – JackPoint