লারাভেল এবং ইওলোভেন্ট ব্যবহার করে দুটি তারিখের মধ্যে কীভাবে জিজ্ঞাসা করবেন?


122

আমি একটি প্রতিবেদন পৃষ্ঠা তৈরির চেষ্টা করছি যা নির্দিষ্ট তারিখ থেকে নির্দিষ্ট তারিখের প্রতিবেদন দেখায়। আমার বর্তমান কোডটি এখানে:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', $now)->get();

এটি সরল এসকিউএল এ যা করে তা হ'ল select * from table where reservation_from = $now

আমার এখানে এই ক্যোয়ারী আছে তবে আমি কীভাবে এটি সুস্পষ্ট জিজ্ঞাসায় রূপান্তর করতে জানি না।

SELECT * FROM table WHERE reservation_from BETWEEN '$from' AND '$to

আমি কীভাবে উপরের কোডটি সুস্পষ্ট প্রশ্নের সাথে রূপান্তর করতে পারি? তুমাকে অগ্রিম ধন্যবাদ.


তারিখের ফর্ম্যাটটি কী reservation_from। আপনি তার উপর ভিত্তি করে কার্বন মান ব্যবহার করতে পারেন।
আথি কৃষ্ণান

তারিখের ফর্ম্যাটটি টাইমস্ট্যাম্প
@

4
এটা মত হবে , Reservation::where('reservation_from', '>=', Carbon::createFromDate(1975, 5, 21);) ->where('reservation_from', '<=', Carbon::createFromDate(2015, 5, 21);)->get();
আথি কৃষ্ণান

উত্তর:


247

whereBetweenপদ্ধতি যাচাই একটি কলাম মান দুটি মানের মধ্যে হয়।

$from = date('2018-01-01');
$to = date('2018-05-02');

Reservation::whereBetween('reservation_from', [$from, $to])->get();

কিছু ক্ষেত্রে আপনাকে গতিশীলভাবে তারিখের সীমা যুক্ত করতে হবে। @ অ্যান্টিভেটিভের মন্তব্যের ভিত্তিতে আপনি এটি করতে পারেন:

Reservation::all()->filter(function($item) {
  if (Carbon::now->between($item->from, $item->to) {
    return $item;
  }
});

আপনি যদি আরও শর্ত যুক্ত করতে চান তবে আপনি ব্যবহার করতে পারেন orWhereBetween। আপনি যদি কোনও তারিখের ব্যবধান বাদ দিতে চান তবে আপনি ব্যবহার করতে পারেন whereNotBetween

Reservation::whereBetween('reservation_from', [$from1, $to1])
  ->orWhereBetween('reservation_to', [$from2, $to2])
  ->whereNotBetween('reservation_to', [$from3, $to3])
  ->get();

অন্য দরকারী যেখানে ক্লজ: whereIn, whereNotIn, whereNull, whereNotNull, whereDate, whereMonth, whereDay, whereYear, whereTime, whereColumn, whereExists, whereRaw

ল্যারাভেল ডকস হু হেইল ক্লজ সম্পর্কে।


কিভাবে এই যদি ঘাঁটা হবে $fromএবং $toগতিশীল তারিখ মডেলটির অন্তর্গত হবে? যেমন একটি effective_atএবং expires_atক্ষেত্র রয়েছে এবং আমি জিজ্ঞাসা করতে চাই যে বর্তমান আইটেমটি সেই সীমার মধ্যে রয়েছে কিনা। আমি each()এটি ব্যবহার করে যদি একটি চেষ্টা করেছিলাম Carbon::now()->between( ... ), তবে এটি এখনও সমস্ত ফলাফল প্রদান করে।
রকিন

4
আমার উপরের মন্তব্যটির জন্য সম্পাদনা করুন: উপেক্ষিত filter(), কৌশলটি করেছে। MyModel::all()->where('column', 'value')->filter(function ($item) { if (Carbon::now->between($item->effective_at, $item->expires_at)) { return $item; } })->first();
রকিন

1
আপনার দরকারী মন্তব্যের জন্য @ অভিনব ধন্যবাদ। আমি আপনার মন্তব্যের ভিত্তিতে আমার উত্তর আপডেট করব।
পিটার কোটা

এটি কেবল তারিখের রেকর্ড থেকে দেবে।
মুহাম্মদ

1
দ্বিতীয় পদ্ধতিতে সমস্যা আছে। এটি ডিবি থেকে মেমরিতে সমস্ত রেকর্ড লোড করবে এবং কেবলমাত্র এটি ফিল্টারিং সম্পাদন করবে।
জিনো অ্যান্টনি

12

আপনার ক্ষেত্রের datetimeপরিবর্তে অন্য বিকল্প date( যদিও এটি উভয় ক্ষেত্রে কার্যকর হয় ):

$fromDate = "2016-10-01";
$toDate   = "2016-10-31";

$reservations = Reservation::whereRaw(
  "(reservation_from >= ? AND reservation_from <= ?)", 
  [$fromDate." 00:00:00", $toDate." 23:59:59"]
)->get();

1
প্রযুক্তিগতভাবে এটি $ টু ডেট করার প্রয়োজন হবে না। "23: 59.59.999"?
স্টিভপোয়েল2000

@ stevepowell2000 এটি আপনার ডাটাবেসের উপর নির্ভর করে, আমার ক্ষেত্রে আমরা এই ফর্ম্যাটটির সাথে 'YYYY-MM-DD HH: MM: SS' একটি মাইক্রোসেকেন্ডের নির্ভুলতা ছাড়াই একটি ডেটটাইম মাইএসকিএল ক্ষেত্রে সংরক্ষণ করি। সম্পর্কিত তথ্য: dev.mysql.com/doc/refman/8.0/en/datetime.html
টমলপ্রড

দুর্দান্ত পয়েন্ট। তাই আপনি যদি এটি একটি DATETIME বা টাইমস্ট্যাম্প ক্ষেত্র ছিল আমরা may সব 23 উপায় বাইরে যেতে: 59: 59,999999 "একজন DATETIME এ বা TIMESTAMP এ মান মাইক্রোসেকেন্ড (6 সংখ্যার) স্পষ্টতা পর্যন্ত একটি trailing ভগ্ন সেকেন্ড অংশ অন্তর্ভুক্ত করতে পারে।"
স্টিভপোয়েল2000

1
ধন্যবাদ আপনি আমার কাজটি আগে করতে আমাকে সাহায্য করেছেন! এই উত্তর ভালবাসা ভাই! :) -হাবি
হবি স্মার্ট

10

নিম্নলিখিত কাজ করা উচিত:

$now = date('Y-m-d');
$reservations = Reservation::where('reservation_from', '>=', $now)
                           ->where('reservation_from', '<=', $to)
                           ->get();

8

আপনি যদি DB: => তে দুটি তারিখের মধ্যে বর্তমান তারিখের উপস্থিতি আছে কিনা তা পরীক্ষা করতে চান তবে কর্মীর আবেদনটি আজকের তারিখের থেকে এবং তারিখ থেকে বিদ্যমান থাকলে কোয়েরিটি আবেদন তালিকাটি পেয়ে যাবে।

$list=  (new LeaveApplication())
            ->whereDate('from','<=', $today)
            ->whereDate('to','>=', $today)
            ->get();

7

এটা চেষ্টা কর:

যেহেতু আপনি একটি একক কলাম মানের উপর ভিত্তি করে আনছেন আপনি একইভাবে আপনার ক্যোয়ারী সরল করতে পারেন:

$reservations = Reservation::whereBetween('reservation_from', array($from, $to))->get();

শর্তের ভিত্তিতে পুনরুদ্ধার করুন: লারাভেল ডক্স

আশা করি এটি সাহায্য করেছে।


6

এবং আমি মডেল সুযোগ তৈরি করেছি

স্কোপগুলি সম্পর্কে আরও:

কোড:

   /**
     * Scope a query to only include the last n days records
     *
     * @param  \Illuminate\Database\Eloquent\Builder $query
     * @return \Illuminate\Database\Eloquent\Builder
     */
    public function scopeWhereDateBetween($query,$fieldName,$fromDate,$todate)
    {
        return $query->whereDate($fieldName,'>=',$fromDate)->whereDate($fieldName,'<=',$todate);
    }

এবং নিয়ামকটিতে, কার্বন লাইব্রেরিটিকে শীর্ষে যুক্ত করুন

use Carbon\Carbon;

অথবা

use Illuminate\Support\Carbon;

এখন থেকে শেষ 10 দিনের রেকর্ড পেতে

 $lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(10)->toDateString(),(new Carbon)->now()->toDateString() )->get();

এখন থেকে শেষ 30 দিনের রেকর্ড পেতে

 $lastTenDaysRecord = ModelName::whereDateBetween('created_at',(new Carbon)->subDays(30)->toDateString(),(new Carbon)->now()->toDateString() )->get();

1
যেখানে দ্বিতীয় প্যারামের মধ্যবর্তী তারিখের জন্য একটি অ্যারে হওয়া দরকার।
মিকি

এটি বিল্ডার পদ্ধতি নয় এমন মডেলের কেবল একটি ক্ষেত্র
মনোজকিরান A

ওহ হ্যাঁ, একরকম মিস করেছেন। আমার খারাপ :)
মিকি

5

ডেটটাইম ক্ষেত্রটি এমন হওয়া উচিত।

return $this->getModel()->whereBetween('created_at', [$dateStart." 00:00:00",$dateEnd." 23:59:59"])->get();

2
হাই, স্ট্যাক ওভারফ্লোতে আপনাকে স্বাগতম ইতিমধ্যে অনেক প্রশ্নের উত্তর রয়েছে এমন প্রশ্নের উত্তর দেওয়ার সময়, দয়া করে আপনি যে প্রতিক্রিয়া সরবরাহ করছেন তা কেন তাত্পর্যপূর্ণ এবং মূল পোস্টার দ্বারা ইতিমধ্যে যা অনুসন্ধান করা হয়েছে তা প্রতিধ্বনিত করে না কেন সে সম্পর্কে কিছু অতিরিক্ত অন্তর্দৃষ্টি যোগ করার বিষয়ে নিশ্চিত হন। এটি "কোড-কেবল" উত্তরের ক্ষেত্রে বিশেষত গুরুত্বপূর্ণ যা আপনি সরবরাহ করেছেন important
chb

3

আমি জানি এটি একটি পুরানো প্রশ্ন হতে পারে তবে আমি নিজেকে নিজেকে এমন পরিস্থিতিতে পেয়েছি যেখানে লারাভেল ৫.7 অ্যাপে আমাকে এই বৈশিষ্ট্যটি প্রয়োগ করতে হয়েছিল। নীচে আমার কাছ থেকে কি কাজ করেছে।

 $articles = Articles::where("created_at",">", Carbon::now()->subMonths(3))->get();

আপনার কার্বনও ব্যবহার করতে হবে

use Carbon\Carbon;
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.