Bạn có thể thực hiện raw
truy vấn với tổng hợp ()
có thể sử dụng $ lookup
toán tử để thực hiện "tham gia" tại đây:
$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
sẽ trả về một "mảng" cho trường đích chứa "không có" hoặc nhiều mục nhập phù hợp hơn với 'localField'
được cung cấp (các) giá trị, trong đó giá trị đó là số ít hoặc là một mảng giá trị. Thông thường, chúng tôi sử dụng ObjectId
tại đây, đặc biệt là khi liên kết đến 'ForeignField'
dưới dạng _id
.
Điều này tốt hơn bất kỳ điều gì có thể được thực hiện ở phía máy khách, vì bất kỳ hoạt động nào khác sẽ yêu cầu thực hiện nhiều truy vấn đến cơ sở dữ liệu cho mỗi nguồn thu thập. $ lookup
thực hiện điều này trong một yêu cầu và phản hồi duy nhất.
Lưu ý thực sự duy nhất là vì đây là "tách biệt" với ORM / ODM, bạn cần chỉ định "tên bộ sưu tập" thực tế chứ không phải của lớp hoặc mô hình. Vì vậy, tôi chỉ giả định là "người dùng"
ở đây, nhưng bạn có thể cần phải điều chỉnh điều đó cho phù hợp với những gì bộ sưu tập của bạn dành cho Người dùng
thực sự được gọi là.
Nhưng dù sao đi nữa, sau khi bạn có dữ liệu "đã kết hợp" thì bạn có thể $ match
trên "usrEmail"
từ dữ liệu đã kết hợp và đưa vào truy vấn của bạn.
Đối với truy vấn thực tế, vì về cơ bản bạn đang thực hiện $ hoặc
điều kiện trên dữ liệu từ cả hai bộ sưu tập, chúng tôi thực sự không thể $ match
cho đến khi "sau khi" tham gia được thực hiện.
Sau đó, tất nhiên có các giai đoạn tổng hợp cho $ bỏ qua
và $ limit
cho việc phân trang của bạn.