web-dev-qa-db-ja.com

Laravel収集日の比較

わかりましたので、私は答えのために何時間も探していましたが、答えを見つけることができないようです。すべて異なる日付の「注文」の配列があります。今週のすべての注文を取得しましたが、これは問題にはなりません。それから、曜日ごとにタブを表示します。

これまでに試したことはこれです:

$dinnerOrders->where('date','>',$date)->where('date','<', $date->endOfDay())->sortBy('created_at');

$ dateは次のとおりです。

$dt = Carbon\Carbon::create()->startOfWeek();
Carbon\Carbon::setTestNow($dt);
$date = new Carbon\Carbon('this ' . $day);

そして$ dinnerOrdersは以下によって取得されます:

$dinnerOrders = collect([]);
foreach($restaurant->dinners as $dinner) {
    foreach($dinner->orders as $order) {
        $dinnerOrders[$order->id] = $order;
    }
 }

日付は正しいようで、SQLで表現されています。 $ dinnerOrdersがコレクションであるため、これは機能していませんか?

Mysqlターミナルで動作しているにもかかわらず、何もない、つまり空のセットです。

だから私が尋ねているのは、おそらく、あなたはコレクションの日付比較を行うことができますか?もしそうなら、どのように?

13
Oskar Jedvert

質問で述べたように、_$dinnerOrders_はクエリではなくコレクションです。 Collectionwhere()メソッドの動作は少し異なります。

コレクションの場合、where()メソッドは演算子を受け入れません。等価比較のみを行います。最初のパラメーターはキー、2番目のパラメーターは値、3番目のパラメーターはブール値であり、緩やかな比較(==)と厳密な比較(===)のフラグを立てます。

あなたが探しているのはfilter()メソッドです。日付の比較を行うクロージャーを渡します。クロージャーがtrueを返す場合、アイテムはコレクションに残ります。 falseを返す場合、アイテムはコレクションから削除されます。このようなもの(単なる例、ロジックを微調整する必要があるかもしれません):

_$dinnerOrders = $dinnerOrders->filter(function ($item) use ($date) {
    return (data_get($item, 'date') > $date) && (data_get($item, 'date') < $date->endOfDay());
});
_

質問の編集

編集で提供されたコードに基づいて、レストランのhasManyディナーとディナーのhasMany注文が推測されます。これが正しければ、レストランにディナーを介して多くの注文があることを示す関係を設定できます。

Restaurant.php:

_public function orders() {
    // restaurant has many orders through dinners
    $this->hasManyThrough('App\Order', 'App\Dinner');
}
_

この関係を設定すると、クエリビルダーを使用して情報を取得できます。

_$dinnerOrders = $restaurant->orders()->where('date','>',$date)->where('date','<', $date->endOfDay())->get();
_
16
patricus