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
3Dプリンター関連の新しいwebサービスを考えています。
実はZortrax M200を購入して、運よく数日後には届いたのですが中々忙しくてまだ4個ほどしか出力していません。
しかも、3Dプリンターを入手した翌日にこれで何か面白いことができないか考えていたら、面白い??Webサービスを思い付いたのでこちらの方に夢中になった次第です。とりあえず2,3週間ほどでα版の開発をして仮にリリースしたいと思っています。
元々このブログは3Dプリンター関連の記事を書きたいと思っていたのですが、まぁ混在してもいいやって感じになってきました。
作るのは3Dプリンター関連のコミニュティー(SNS風)のサービスになると思います。
具体的にはリリース前に言いたいと思います。
・開発環境
php Laravel5
jQuery、MySQL、Facebook api、 twitter api
サーバ環境は考え中
もとはLinax、windowsのアプリを開発してたのでC++ユーザで、phpは趣味でさわっていました。
開発環境ではOpenpenやWordPress+BuddyPressも少し触ってみたのですが、仕様理解するのがめんどうなってきて、とりあえずLaravel使ってスクラッチで開発しています。 今までCakePHPを少し触ったことがあるのでこの辺は理解しやすいです。