2017-03-13 25 views
0

2つのテーブルを結合し、結合されたテーブルのフィールドでフィルタリングします。私は実際のテーブルがこの質問に関係するとは思えませんが、日付がテーブルにイベント情報が追加されたテーブルなので、1つのイベントに対してより多くの日付が可能です。 私はこの雄弁なラインを作った:Laravel雄弁なバグ?

Event_date::whereRaw('startdate >= curdate() OR enddate >= curdate()')->whereHas('Event', function($q){$q->where("approved",true);})->orderBy('startdate', 'asc')->orderBy('enddate', 'asc')->toSql()); 

フィルタはしかし動作しません。だから、なぜ私は行に - > toSql()を追加しました。 私は戻って、次を得る:

select * from `event_dates` where startdate >= curdate() OR enddate >= curdate() and exists (select * from `events` where `event_dates`.`event_id` = `events`.`id` and `approved` = ?) order by `startdate` asc, `enddate` asc 

あなたがで「( 『承認』、真の)」結果「......ととapproved =)?」という参照questionmarkから来ない場合は???私は「1」、「1」、「真」、「真」、「真」のような別のものを試しました...すべてが疑問符として戻ってきます。

ありがとうございます!

Erwin

+0

PDOはそのように機能します!それは '?'を送る。プレースホルダ、および対応する値の配列です。これは、SQLインジェクションを防ぐことです –

答えて

3

これは予想される動作です。 Laravelは準備済みのステートメントを使用します。

$query = Event_date::whereRaw('startdate >= curdate() OR enddate >= curdate()')->whereHas('Event', function($q){$q->where("approved",true);})->orderBy('startdate', 'asc')->orderBy('enddate', 'asc')); 

となりまし

echo $query->toSql(); 
var_dump($query->getBindings()); 

を持つ両方のクエリを取得する:プレースホルダに置かれたパラメータを取得するには、あなたが使用することができ、あなたのケースで例えばので

$query->getBindings(); 

を使用することができますプレースホルダの代わりに配置されるプレースホルダと値。