16

わかりましたので、何時間も答えを探していましたが、見つけられないようです。すべて異なる日付の「注文」の配列があります。今週のすべての注文を受け取りましたが、これは問題ではありません。次に、各曜日のタブが必要です。

私がこれまでに試したことは次のとおりです。

$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ターミナルで動作しているにもかかわらず、空のセットです。

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

4

1 に答える 1

26

注: この回答は Laravel <= 5.2 に固有のものです。Laravel 5.3では、クエリ ビルダーと一致するようにのwhere()メソッドが更新されたため、演算子を受け入れるようになりました。Collection


質問で述べているように$dinnerOrders、クエリではなくコレクションです。のwhere()メソッドCollectionは少し異なります。

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

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

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

質問の投稿編集

編集で提供されたコードに基づいて、レストランには多くのディナーがあり、ディナーには多くの注文があると推測しています。これが正しければ、レストランがディナーを通じて多くの注文を持っていることを示す関係をセットアップできます。

レストラン.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();
于 2015-11-19T15:12:09.100 に答える