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.
Related
So I have a table in MySQL which looks like this
these are basically ads that are posted by users. Duration column in this table is about for how many days the User wants to show their ad. that means if user choose to post ad for 3 days i should not just show after 3 days that means it will expire after three days. Now i Want to retrieve only those records which are not expired.
I have searched a lot but could not find a way to do this. Kindly give me a solution or refer to a link where i can possibly find the solution.
Right now I am using this script to get the records with simple pagination
$items=Post::with('items','users')->paginate(12);
$categories = DB::table('item_categories')->get();
return view('search_post', compact('items','categories'));
You should do an Where Clause with your paginate.
as stated here: https://stackoverflow.com/a/50903963/3808783
like:
$items=Post::with('items','users')
->where('created_at', '<=', Carbon::now()->addDays(3))
->paginate(12);
Use Carbon to do so.
Simply add duration to created_at with Carbon addDay($duration) method.
Then return your posts where the result is >= to today().
So I changed my table to this
And using this script
$items=Post::with('items','users')->where('duration','>=',\Carbon\Carbon::now() )->paginate(12);
$categories = DB::table('item_categories')->get();
return view('search_post', compact('items','categories'));
It is working perfectly. Thanks to every one.
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 want to select all the data on a database using laravel db query or Eloquent ORM. So i want all the data that are other than 3 days from the day they where created. Data 'A' is created on 15th i come in on 16th to check, i won't see Data 'A' but i may see others older than 3 days or equal to 3 days. If i come back on the 18th or 19th i should see Data 'A', obviously because it now older than 3 days or equal to.
so i wrote this code that is not working below
$users = DB::table('matched_users')->where( 'created_at', '>=',
Carbon::now()->subDays(3));
so can anyone correct this for me.
when i did that it work but it shows both someone that his date is just one day one. so is that not enough code
Data Name - created_at
ozil 21/04/2012 16:09:22
mark 21/04/2012 16:09:22
cyril 22/04/2012 16:19:21
so today is 25/04/2012 if run the query of run the above query as it is i get all the result back.
But if change the >= to <= the result is an empty collection
I guess you mean 'older than 3 days from the day they where created'. In this case the query should look like this:
DB::table('matched_users')->where('created_at', '<=', Carbon::now()->subDays(3));
$users = DB::table('matched_users')->whereDate( 'created_at', '<=', Carbon::now()->subDays(3))->get();
is the right way to write the code
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();
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();