How to select from database using laravel where clause and created_at - php

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

Related

Laravel eloquent grabbing results between two days

I have a model for which I have a database field called day. This is a unique field and it can contain a day like monday, tuesday, and so on. So monday can only be used once, etc. The value is literally stored as a string.
Now I am trying to display only upcoming x results, for example, only the results from the next 3 days. Which means, I want to display the result of today, tomorrow and the day after tomorrow. I have been trying like below:
Model::where('day', '>=', Carbon::now())
->where('day', '<', Carbon::now()->addDays(3))
->get();
But this does not give me any results. I want to prevent having to change the field to a date field, for now. But I was wondering if there is any way to achieve what I am looking for with a simple eloquent query.
if the day is unique you can get the next three days and select their results:
$today=Carbon::now()->dayName;
$tomorrow=Carbon::tomorrow()->dayName;
$afterTomorrow=Carbon::tomorrow()->addDay()->dayName;
$acceptableDays=[$today,$tomorrow,$afterTomorrow];
Model::whereIn('day', $acceptableDays)
->get();
pay attention to letter case, Carbon::now()->dayName; will gave you the day name with first capital letter, you should convert it to match the way it stored in your db

How to retrieve records from database table in Laravel and prevent those which are expired

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.

Get Date time differnce base result (laravel 5.3)

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();

Get Last n Months Data Group by Week - Laravel

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'.

Getting all records that are 3months old in Postgres

I need to find all records that are exactly 3months old in Postgres
My query looks as follows.
SELECT * FROM adds WHERE adtype = 'CL' AND DATEDIFF(dstart,DATE(now())) = DATE_SUB(curdate(),interval 3 month);
But this does not seem to work. Any advise help with this query will be helpful. I can calculate this in PHP but want to find out the value using a Postgres query.
You are comparing a time period to a point in time.
Is there really a DATEDIFF in Postgres?
Are you sure you need the records of that one day exactly 3 months in the past? Unusual application.
I'd suggest: WHERE DATE(dstart) = DATE(NOW())-INTERVAL '3 month'

Categories