Sie können ein raw
erstellen Abfrage mit aggregate()
die den $lookup
verwenden können
Operator, um den "Join" hier zu bewirken:
$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 )
));
});
Der $lookup
gibt ein "Array" für das Zielfeld zurück, das "keine" oder mehr übereinstimmende Einträge zum angegebenen 'localField'
enthält value(s), wobei dies entweder ein Singular oder ein Array von Werten ist. Normalerweise verwenden wir ObjectId
hier, insbesondere bei der Verlinkung auf das 'foreignField'
als _id
.
Dies ist besser als alles, was clientseitig durchgeführt werden kann, da jede andere Operation mehrere Abfragen an die Datenbank für jede Sammlungsquelle erfordern würde. $lookup
tut dies in einer einzigen Anfrage und Antwort.
Der einzige wirkliche Hinweis ist, dass Sie, da dies vom ORM/ODM "getrennt" ist, den tatsächlichen "Sammlungsnamen" und nicht den der Klasse oder des Modells angeben müssen. Ich gehe also nur von "users"
aus hier, aber Sie müssen dies möglicherweise an Ihre Sammlung für Users
anpassen heißt eigentlich.
Wie auch immer, nachdem Sie die "verbundenen" Daten haben, können Sie $match
auf "usrEmail"
-Eigenschaft aus den zusammengeführten Daten und schließen Sie sie in Ihre Abfrage ein.
Was die eigentliche Abfrage betrifft, da Sie im Grunde einen $or
ausführen Bedingung für Daten aus beiden Sammlungen können wir nicht wirklich $match
bis "nachdem" die Verknüpfung durchgeführt wird.
Dann gibt es natürlich die Aggregationsstufen für $skip
und $limit
auch für deine Paginierung.