On my website, I use Laravel's created_at to store the time at which images are uploaded.
However, I want to be able to create a query that gets images only within a specific time frame.
Those would be:
-The past 24 hours
-The past week
-The past month
-The path year
I was thinking of something like...
$images = Images::where('created_at', '>=', Carbon::now()->hours(24))->get();
It would be easy to get records from within specific hours, since I could simply go from 24 to 168 to 672 to 2087 (day, week, month, year).
Thoughts?
Use sub methods:
Images::where('created_at', '>=', Carbon::now()->subDay())->get();
Images::where('created_at', '>=', Carbon::now()->subWeek())->get();
Images::where('created_at', '>=', Carbon::now()->subMonth())->get();
Images::where('created_at', '>=', Carbon::now()->subYear())->get();
Or:
Images::where('created_at', '>=', Carbon::now()->subHours(24))->get();
Related
I want to filter available time for today for a user. He can only make an appointment for a time slot that is bigger than time right now + 6 hours. But the problem is when + 6 hours transfers to the next day so it could be like 00:44 next day and in that case when it compares to the time slots it shows that time slot at 8:00 for example is bigger than 00:44 so it shows that time slot for today although it shouldn't be possible to make an appointment for that time slot anymore. Is there a way to filter it in the eloquent? I basically want addHours to stop if it reaches 23:59. My Eloquent function:
$times_today = TimeSlot::where('status', 1)
->whereTime('time', '>', Carbon::now()->addHours(6))
->get();
Carbon provides a tomorrow() function that you can use in the same way you've made use of now().
I assume you don't want people booking appointments up until midnight (although perhaps you do?) so I would also use the subHours() function to limit timeslots to before a certain time.
$times_today = TimeSlot::where('status', 1)
->whereTime('time', '>', Carbon::now()->addHours(6))
->whereTime('time', '<', Carbon::tomorrow()->subHours(2))
->get();
You can create timestamp for specfic time using create function with time zone then you can aad hours in current timestamp by using Carbon::now()->addHours(6)
$dtToronto = Carbon::create('2022','8','2', 23,59,59, 'America/Toronto');
$times_today = TimeSlot::where('status', 1)
->whereTime('time', '>', Carbon::now()->addHours(6))
->whereTime('time', '<=', $dtToronto)->get();
I have a weird issue with datetimes in my database and PHP code.
Carbon::now() currently returns 2018-03-08 01:33:47 which is correct, that is the time on my computer and in my country.
I put a record with the expires_at value at 2018-03-08 02:32:02 which is in 1 hour (or 59 minutes of you want to become technical).
It wasn't displayed in my query, the query that is supposed to select all records where expires_at is before the current time, so non expired records.
Althought, when setting the datetime to 2018-03-09 01:32:28 it displays that it expires in 23 hours? If I post it anything older (say 14 hours after the current datetime) it will be shown as expired?
$keys = UserAccountKey::where('user_id', Auth::user()->id)
->whereDate('expires_at', '>=', Carbon::now())
->get();
The sql of your query is:
select * from `user_account_keys` where date(`expires_at`) >= '2018-03-08 01:33:47'
The date('expires_at') gets the date part of the expires_at field, ie '2018-03-08', obviously '2018-03-08' is less than '2018-03-08 01:33:47', so Your query did not get any result.
Just use where('expires_at', '>=', Carbon::now()) instead.
See this demo https://implode.io/vTWTWP
I am trying to delete all entries which have not been viewed in the past 30 days and are were created more than 30 days ago.
The column last_viewed_at's default value is null, so in case the entry was created_at 5 days ago and was not viewed, the row should get not be deleted.
I currently use
$medias = Media::where('last_viewed_at', '<=', $delete_after_x_days)->get();
This code snippet does not include the scenarios of where a media item was created during the last 30 days and has not been viewed, so should not be deleted just yet.
Somehow, I need to check created_at if last_viewed_at is null to make sure the media is older than 30 days.
Any help would be greatly appreciated!
i have no idea in your model how you use but your where condition would look like this,
last_viewed_at is not null and last_viewed_at<= $delete_after_x_days
Finally, I came up with a solution thanks to #knowledge....'s hint.
$medias = Media::where('created_at', '<=', $delete_after_x_days)
->where(function ($medias) use ($delete_after_x_days) {
$medias->where('last_viewed_at', '<=', $delete_after_x_days)
->orWhereNull('last_viewed_at');
})
->get();
This makes sure the entry is older than x days and that last_viewed_at is also older than 30 days or is null.
I have a deliverables table and i want to get results where difference between current date time is 2 days from created date.
e.g today is 4-19-2017 i want to get all records where deadline is 4-21-2017 because here is difference of 2 days between 4-19-2017 and 4-21-2017 or also if 4-20-2017 it should also retrieve how ever if difference is more than 2 it should not be retrieve.
In short if Difference between current date and deadline is 2 days or less should be retrieve
I tried as
$deliverables_dead = DB::table('deliverables')->where('user_id' , Auth::user()->id)->where('deadline' , '>' , Carbon\Carbon::now())->get();
its get all records where is deadline greater than current time.
Please help how can i get answer of above bold statement......
Use whereBetween() and Carbon's addDays():
DB::table('deliverables')
->where('user_id', auth()->id())
->whereBetween('deadline' , [Carbon\Carbon::now(), Carbon\Carbon::now()->addDays(2)])
->get();
I am trying to get last 4 months data filtered by week in Laravel. This is code I currently have:
$analytics =
Data::select([
DB::raw('WEEK(p_date_time) AS week'),
DB::raw('COUNT(id) AS count'),
])
->where('p_id', $p_id)
->where('p_date_time', '>=', Carbon::now()->subMonth(4))
->groupBy('week')
->orderBy('week')
->get()
->toArray();
This code gives me 52 results based on Data for 1 full year (As I am using WEEK). But I need around 17 results for the last 4 months.
I can make that happen by gathering of each day and then adding 7 days data as chunk for last 4 months, but how can I do it with query alone?
Thanks.
Maybe just a typo in your Carbon query. Change subMonth(4) to subMonths(4). With 's'.