2016-09-20 21 views
1

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で変更されました。

答えて

1

あなたが把握しているとおり、whereLoose()が役に立ちます。その理由は、メソッドが文字通りwhere()メソッドを呼び出し、の厳密な型チェックの3番目の引数としてfalseを渡すためです。 documentationパー

:非厳密な比較では

enter image description here

(あなたがとwhereLoose()で得るもの)、それは種類を両立しようとします。この場合、具体的には、オブジェクトが__toString()メソッド(Carbonのように)を持つ場合、オブジェクトを比較しようとして文字列に変換できます。

厳密な比較では、型を混乱させないため、あるオブジェクトインスタンスを別のオブジェクトインスタンスと直接比較しようとしています。

PHP object comparisonでは、「オブジェクト変数が同じクラスの同じインスタンスを参照する場合に限り、オブジェクト変数が同一である」場合、===の厳密な型チェックが真になります。

ところで良い質問です!

+0

ありがとう、ジェレミー!私は今それを得ました:*彼らは同じインスタンスを参照する必要があります*。 '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

関連する問題