Yêu cầu thg 6 30, 2022 7:26 CH 164 0 2
  • 164 0 2
0

Tìm kiếm ngày tháng trong Laravel mongodb

Chia sẻ
  • 164 0 2

e có sử dụng thư viện jenssegers/mongodb cho dự án laravel, các cao nhân cho e hỏi làm sao để tìm kiếm ngày và giờ trong mongdo

bài toàn là tìm các document từ ngày 2020-05-28 -> 2020-05-29 và trong 2 ngày đó tìm tiếp giờ từ 06:00 -> 08:00

code như sau (sử dụng Query Builder)

/** @var $db Jenssegers\Mongodb\Query\Builder */ $db = DB::connection('mgdb')->table('test');

$db
->whereDate('dateShot', '>=', Carbon::parse('2020-05-28'))
->whereDate('dateShot', '<=', Carbon::parse('2020-05-29'))
->whereTime('dateShot', '>=', Carbon::parse('06:00'))
->whereTime('dateShot', '<=', Carbon::parse('08:00'))

or

$db
->whereDate('dateShot', '>=', '2020-05-28')
->whereDate('dateShot', '<=', '2020-05-29')
->whereTime('dateShot', '>=', '06:00')
->whereTime('dateShot', '<=', '08:00')

or

$db
->where('dateShot', '>=', '2020-05-28 00:00:00')
->where('dateShot', '<=', '2020-05-29 23:59:59')
->whereTime('dateShot', '>=', '06:00')
->whereTime('dateShot', '<=', '08:00')

ở đây là tìm riêng ngày và trong các ngày đó lọc các giờ ra, nhưng nó đều trả về là không có dữ liệu và với code trên mà tìm kiếm trên mysql thì ra e có tìm hiểu về query raw nhưng cũng thử vài cách rồi nhưng vẫn không được

xin các cao nhân trợ giúp, e xin cảm ơn ạ !

2 CÂU TRẢ LỜI


Đã trả lời thg 7 1, 2022 2:29 SA
0

thử MongoDate xem

$start = new MongoDate(strtotime("2020-05-28 06:00:00"));
$stop = new MongoDate(strtotime("2020-05-29 08:00:00"));

$users = DB::connection('mgdb')->collection('test')->whereBetween('dateShot', array($start, $stop))->get();
Chia sẻ
Avatar Dương Hải @duonghainbs
thg 7 1, 2022 3:52 SA

@sunmayfest hiện tại e đang dùng PHP 8 thì class MongoDate không còn được hỗ trợ nữa. Cũng đã thử class thay thế của MongoDate là MongoDB\BSON\UTCDateTime thì cũng ko được.

Cái chính của phần tìm kiếm trên là còn lọc thời gian nữa (vd: từ 06:00 -> 08:00), Trong 2 ngày 28 và 29 thì lấy ra các document có thời gian từ 6h-8h chứ ko phải là 6h ngày 28 đến 8h ngày 29

Đã trả lời thg 7 1, 2022 7:31 SA
0

Bạn thử tách ra 2 vế rồi dùng OR xem.

->whereBetween('dateShot', ['2020-05-28 06:00', '2020-05-28 08:00'])
->orWhereBetween('dateShot', ['2020-05-29 06:00', '2020-05-29 08:00'])
Chia sẻ
Avatar Dương Hải @duonghainbs
thg 7 1, 2022 9:14 SA

@lehuyvuong theo ví dụ của mình mình lấy 2 ngày cho ngắn ít dữ liệu, nếu lọc toàn bộ từ ngày 2020-05-01 -> 2020-05-29 thì nó sẽ ko phù hợp cho code của bạn. nếu ở mysql thì đơn giản vô cùng nhưng chuyển sang mongodb thì lại phức tạp tìm kiếm mấy hôm nay nhưng không ra được cách nào cả 😀

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí