raw
を実行できます Aggregate()
を使用したクエリ $ lookup
を使用できます
ここで「結合」を実行する演算子:
$result = Booking::raw(function($collection) use($search, $start, $limit) {
return $collection->aggregate(array(
array( '$lookup' => array(
'from' => 'users',
'localField' => 'user',
'foreignField' => '_id',
'as' => 'user'
)),
array( '$unwind' => array(
'path' => '$user', 'preserveNullAndEmptyArrays' => True
)),
array( '$match' => array(
'$or' => array(
array( 'invoice_number' => array( '$regex' => $search ) ),
array( 'payment_type' => array( '$regex' => $search ) ),
array( 'txid' => array( '$regex' => $search ) ),
array( 'user.usrEmail' => array( '$regex' => $search ) )
)
)),
array( '$skip' => $start ),
array( '$limit' => $limit )
));
});
$ lookup
指定された'localField'
に「none」以上の一致するエントリを含むターゲットフィールドの「配列」を返します value(s)、ここで、それは単数または値の配列のいずれかです。通常、 ObjectId
を使用します ここで、特に'foreignField'
にリンクする場合 _id
として 。
これは、クライアント側で実行できるものよりも優れています。他の操作では、コレクションソースごとにデータベースに対して複数のクエリを実行する必要があるためです。 $ lookup
これは、単一の要求と応答で実行されます。
唯一の注意点は、これはORM / ODMとは「別」であるため、クラスやモデルの名前ではなく、実際の「コレクション名」を指定する必要があるということです。だから私は"users"
を推測しているだけです ここでは、ユーザー
のコレクションに合わせて調整する必要があるかもしれません。 実際に呼び出されます。
とにかく、「結合された」データを取得したら、 $ match
"usrEmail"
で 結合されたデータのプロパティを取得し、クエリに含めます。
実際のクエリについては、基本的に$または
を実行しているためです。 両方のコレクションのデータ全体の条件は、実際には $ match コード>
結合が実行される「後」まで。
そしてもちろん、 $skipの集計ステージがあります。コード>
および $ limit
あなたのページネーションにも。