ABO ファクトリーのブログ

3PS(3Dプリンター共有)サービスの開発 趣味のプログラム。3Dプリンターを利用した作品を行うサークルとして活動していきたいと思います。

Laravel select where () or() でハマった件

今作成中のwebサービスでユーザ間のメッセージのやり取りを画面上に表示する処理でModelへのアクセス方法でハマった。

過去の送受信のメッセージを表示したいのでA->B、B->Aに送信したメッセージを画面に表示したいので、select whereで括弧orが必要になりますSQL文で書けば以下のように簡単なんですが、LaravelのModelでどのようにアクセスすればいいのかわからない。

SQL

select * from `tb_msg` where (`owner_id` = '9' and `to_id` = '11') or 
							(`owner_id` = '11' and `to_id` = '9') order by `created_at` desc;

■結論

$msg_array = Msg::where(function ($query) use ($owner_id, $to_id) {
		$query->where('owner_id', $owner_id);
		$query->where('to_id', $to_id);
	})->
	orWhere(function ($query) use ($owner_id, $to_id) {
		$query->where('owner_id', $to_id);
		$query->where('to_id', $owner_id);
	})->orderBy('created_at', 'DESC')->get();

d.hatena.ne.jp
こちらのサイトを参考にさせて頂きました。
無名関数使って関数内でさらにwhere and検索すればいいみたいです。


実際には調査してすぐに上記のサイトを見つけてコピペで主要箇所を変更したのですが、なぜか最終行の”->get();”をコピ忘れて意味不明のエラー”ErrorException in compiled.php line 12170:Object of class Illuminate\Database\Eloquent\Builder could not be converted to string”がでて1,2時間悩んでました。converted to stringでLaravel内部でSQLのクエリー作成でエラーが出ているのだと勝手に勘違いして、無意味に変数をいろいろいじってました。

・開発環境
Laravel5
PHP 5.6.8