Laravel 5.2プロジェクトのコレクションのwhere句でCarbonの日付を使用するために過去5つの時間を苦労しています。Laravel Collectionのwhere句でcarbon dateを使用する方法
だから最初に私は、データベースから指定した日に計上予定のコレクションを取得:
その後$bookedRDVs = RDV::where('idAgenda', $idAgenda)
->whereDate('start', "=", $date)
->get();
私は営業時間内のタイムスロット(固定期間)のリストを持っている([businessStart; businessEnd] )私はそれらを無料であるかどうかにしたいと思います。
$currentTime = $businessStart->copy(); // $businessStart is a Carbon date
while($currentTime < $businessEnd){
echo 'start is an object of class ' . get_class($bookedRDVs->first()->start); // start is an object of class Carbon\Carbon
echo 'currentTime is an object of class ' . get_class($currentTime); // currentTime is an object of class Carbon\Carbon
if($bookedRDVs->contains('start', $currentTime)) {
$rdv = $bookedRDVs->where('start', $currentTime)->first();
var_dump($rdv); // prints NULL => why ?
} //end if
} // end while
$bookedRDVs->contains('start', $currentTime)
は本当言うが、その後$bookedRDVs->where('start', $currentTime)
はnullを言う?んなぜ'start'はCarbonオブジェクト、$ currentTimeはCarbonです。
この質問を書いているうちに、where
ではなく、whereLoose
になりました。実際には、whereLoose
の結果はもうnullではありません(それが解決策であるか、私の見た目には問題があります)。同じオブジェクトクラスと同じ値を持つwhere句が検証されないのはなぜですか?
私がここで紛失しているものを指摘してくれてありがとうございます! 5.3より前のLaravelで
持ち帰り(ジェレミーの答え以下)
を、コレクション内のwhere句には、厳密な比較を行います(含まれているが緩ん1を行うのに対し)。これは、比較された「もの」がお互いのクローンである場合にのみ、結果が真であることを意味します。自分自身を納得させるために、私は自分のコードからこの例に頼っ:
$rdv = $bookedRDVs->whereLoose('start', $currentTime)->first();
echo '</br>' . 'start ';
var_dump($rdv->start); // prints object(Carbon\Carbon)#377 (3) { ["date"]=> string(26) "2016-09-13 09:20:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }
echo '</br>' . 'currentTime ';
var_dump($currentTime); // prints object(Carbon\Carbon)#278 (3) { ["date"]=> string(26) "2016-09-13 09:20:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }
echo '</br>' . ' start clone ';
var_dump(clone $rdv->start); // prints object(Carbon\Carbon)#377 (3) { ["date"]=> string(26) "2016-09-13 09:20:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" }
だから$rdv->start
と$currentTime
の唯一の違いは、ハッシュ記号(see here for details)次の番号です。これらの数値が異なる場合、オブジェクトが同じインスタンスに含まれていないことを意味します。 $rdv->start
がクローンされている場合、オブジェクトは本当に同一です!幸いにも、これはthe official upgrade docに従って5.3で変更されました。
ありがとう、ジェレミー!私は今それを得ました:*彼らは同じインスタンスを参照する必要があります*。 'whereLoose'の後に' $ rdv = $ bookedRDVs-> whereLoose( 'start'、$ currentTime) - > first(); \t \t \t \t \t \t \t \tエコー ''。 '開始'; \t \t \t \t var_dump($ rdv-> start); //オブジェクトを印刷する(Carbon \ Carbon)#377いくつかのデータ \t \t \t \tエコー '' '現在の時刻 '; \t \t \t \t var_dump($ currentTime); //オブジェクトを印刷する(Carbon \ Carbon)#278同じデータ \t \t \t \tエコー '' 'クローン開始'; \t \t \t \t var_dump(clone $ rdv-> start); //オブジェクトを印刷する(Carbon \ Carbon)#377いくつかのデータ ' したがって、クローンだけが厳密な比較に合格します! – HelloWorld