(LARAVEL) Two ORDER BY and a LIMIT - php

This is some sorting:
Get 20 posts sorted by "views".
AFTER IT FINISH, then go to the next step.
sort it by "created_at".
How to do it?
Heres my current code (which work, but I dont want to use SORTBY) for some reason sortby is not working for other project. if possible i want it to be as one eloquent query:
$this->data['today_post'] = Posts::orderBy('views', 'desc')->whereRaw('created_at >= NOW() - INTERVAL 1 DAY')->limit(20)->get();
$this->data['today_post'] = $this->data['today_post']->sortByDesc('created_at');
This code is not working, because LIMIT is usually applied as the last operation, so the result will first be sorted by "views" and "created_at" and then limited to 20. I dont want that. I want to sort and limit then after all is complete. I want to sort again the last time.
$this->data['today_post'] = Posts::orderBy('views', 'desc')->orderBy('created_at', 'desc')->whereRaw('created_at >= NOW() - INTERVAL 1 DAY')->limit(20)->get();
Thank you so much

You'll still need to use sortBy() or sortByDesc() if you want to use Eloquent. I've just tested this solution and it works perfectly:
Posts::orderBy('views', 'desc')
->where('created_at', '>=', Carbon::now()->subDay())
->take(20)
->get()
->sortByDesc('created_at');

Related

Laravel query builder count rows by day SQL db::raw

I've got a Laravel 8 application whereby I need to count the number of total applications for each day and output a count of the data in the most efficient way, for instance, 500 applications on 1st, 1,000 applications on 2nd and so fourth, depending on how many applications there are each day.
I'm using DB::raw() to count my rows, however, Laravel's timestamps by default includes the hours, minutes and seconds as part of the date, and so this isn't going to work for me, I need to format the date to exclude this and just contain the day.
My query doesn't seem to be returning anything, and no error either, so I think there's something wrong with my first DB::raw(), it doesn't seem to be formatted the created_at column at all, what am I missing?
Application::whereBetween('created_at', [$from, $to])
->select(DB::raw('DATE_FORMAT("created_at, %Y-%m-%d")'), DB::raw('count(*) as applications'))
->groupBy('created_at')
->get();
You can use groupByRaw()
Application::whereBetween('created_at', [$from, $to])
->select(DB::raw('DATE_FORMAT(created_at, "%Y-%m-%d")'), DB::raw('count(*) as applications'))
->groupByRaw('DATE_FORMAT(created_at, "%Y-%m-%d")')
->get();
Also, you can use selectRaw() instead of select(DB::raw)

How to select from database using laravel where clause and created_at

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

How to limit user requests per hour in laravel

I have a site that has few request options (for example add friend). I want to limit of requests made by use per certain time, for example so he can't send more than 5 friend requests within hour.
QUESTION How Can I achieve this?
I have written following query
$result = DB::table('bubble_users')
->select(DB::raw('count(*) as user_count, status'))
->where('status', '=', "pending")
->where('user_id','=', $user_id)
->where(DB::raw('DATE_ADD(created_at, INTERVAL 1 HOUR) > NOW()'))
->groupBy('status')
->get();
But I'm not getting wrong response
Anybody help me!!
Just get last row of this user on table and get created_at column?
Then make another query to get count requests by this user in the our on the last 'created_at`query value.
So you can know if this our has 1, 2, 3, 4 or five requests.
Is very simple. ;)

Laravel: whereBetween to accept the first date

Scenario:
The startdate and enddata in the database is 2015-07-20 and 2015-07-30 respectively and the query that works properly is,
Model::whereBetween('startdate',array('2015-07-30','2015-08-10'))->get();
The query return 1 record from the table which is the expected result. Now what I expect is a slight change. The query should not retrieve the record by considering the date 2015-07-30 does not fall in between 2015-07-30. How do I achieve this?
whereBetween is inclusive. In order to exclude one of the edges you'll need to build a between query manually:
Model::where('startdate', '>', '2015-07-30')->where('startdate', '<=', '2015-08-10')->get();
Easy Solution
Model::whereBetween(DB::raw('date(startdate)'),array('2015-07-30','2015-08-10'))->get();

Laravel 4 Query with 30 Days Ago Condition

I dont understand where goes wrong. When I add this
where('units.solddate','>=','DATE_SUB(CURDATE(), INTERVAL 30 DAY)')
where clause and my result is empty. I tried in phpMyadmin and it does return results.
$query= (tables)
->select(DB::raw('SUM(units.price) as price, DATE(units.solddate) as date, DAY(units.solddate) as day'))
->where('units.solddate','>=','DATE_SUB(CURDATE(), INTERVAL 30 DAY)')
->where('units.solddate','<=','NOW()')
->groupBy('date')
->get();
Please advice.
The reason why the constraints don't work is that Eloquent takes the value you compare with literally, escapes it when needed and then uses in a query. So if you do
->where('units.solddate','<=','NOW()')
you're in fact comparing units.solddate with a strin NOW(), like in:
... WHERE units.solddate <= 'NOW()'
If you want to use MySQL functions in your query you have to explicitely tell Eloquent/QueryBuilder that you mean the raw value that you provided by using DB::raw() to wrap the value.
The following should work for you:
->where('units.solddate','>=',DB::raw('DATE_SUB(CURDATE(), INTERVAL 30 DAY)'))
->where('units.solddate','<=',DB::raw('NOW()'))

Categories