[英]Laravel Eloquent Query Multiple records based on set criteria
我有一個表單,用戶可以設置“標准”來搜索其客戶數據庫,但是為此我正努力將查詢匯總到一起(在Laravel 5.7中工作)。
當前,客戶可以設置的標准如下:
我現在正設法將其構建到查詢中,甚至無法提供具體的示例! 我的障礙似乎是檢查第一個記錄和最后一個記錄,以確保它符合標准。
SQLFiddle: http ://sqlfiddle.com/#!9/68407/1
我的桌子:
| id | name | email | provider | created_at
---------------------------------------------------------------------------------------
| 1 | Mr Smith | mr.smith@example.com | facebook | 2018-11-01 09:00:00 |
| 2 | Mrs Smith | mrs.smith@example.com | facebook | 2018-11-01 09:00:00 |
| 3 | Miss Smith | miss.smith@example.com | email | 2018-11-01 09:00:00 |
| 4 | Doctor Smith | doctor.smith@example.com | email | 2018-11-01 09:00:00 |
| 5 | Lord Smith | lord.smith@example.com | twitter | 2018-11-01 09:00:00 |
| 6 | Lady Smith | lady.smith@example.com | email | 2018-11-01 09:00:00 |
| 7 | Mr Smith | mr.smith@example.com | facebook | 2018-11-02 09:00:00 |
| 8 | Mrs Smith | mrs.smith@example.com | facebook | 2018-11-02 09:00:00 |
| 9 | Doctor Smith | doctor.smith@example.com | email | 2018-11-02 09:00:00 |
| 10 | Lord Smith | lord.smith@example.com | twitter | 2018-11-02 09:00:00 |
| 11 | Lady Smith | lady.smith@example.com | email | 2018-11-02 09:00:00 |
| 12 | Mr Smith | mr.smith@example.com | facebook | 2018-11-03 09:00:00 |
| 13 | Mrs Smith | mrs.smith@example.com | facebook | 2018-11-03 09:00:00 |
| 14 | Miss Smith | miss.smith@example.com | email | 2018-11-03 09:00:00 |
| 15 | Lord Smith | ord.smith@example.com | twitter | 2018-11-03 09:00:00 |
| 16 | Lady Smith | lady.smith@example.com | email | 2018-11-03 09:00:00 |
查詢的示例客戶條件:
當前查詢:
$Customers = Customer::groupBy('email')
->havingRaw('COUNT(*) > 2’)
->where('created_at', '<', Carbon::now()->subDays(2)->toDateTimeString())
->get();
我不知道如何提取第一個客戶記錄是否已超過2天,然后提取他們的最后一個記錄並確保它已超過1天。 我知道我當前的查詢對於我要實現的目標完全沒有用,但是我再次努力將其組合在一起。
預期成績:
| id | name | email | provider | created_at
---------------------------------------------------------------------------------------
| 12 | Mr Smith | mr.smith@example.com | facebook | 2018-11-03 09:00:00 |
| 13 | Mrs Smith | mrs.smith@example.com | facebook | 2018-11-03 09:00:00 |
您要查找的查詢是:
select * from customers group by email having count(*) > 2 and min(created_at) <= '2018-10-02 09:00:00' and max(created_at) <= '2018-10-03 09:00:00' and provider = 'facebook'
假設當前時間為2018-10-04 09:00:00。
雄辯地:
$Customers = Customer::groupBy('email')
->havingRaw('COUNT(*) > 2')
->havingRaw('max(created_at) < ?' , [Carbon::now()->subDays(2)->toDateTimeString()])
->havingRaw('min(created_at) < ?' , [Carbon::now()->subDays(1)->toDateTimeString()])
->havingRaw('provider = ?' , ['facebook'])
->get();
另外,使用雄辯的方法可以鏈接方法,如下所示
$customers = Customer::groupBy('email');
if( $includeCount ) {
$customers->havingRaw('COUNT(*) > 2');
}
...
...
...
MySQL方言中的SQL查詢進行選擇如下
SELECT id, name, email, provider, created_at
FROM customers
WHERE provider = 'facebook'
GROUP BY email
HAVING
count(*) > 2
AND min(created_at) < date_sub(now(), interval 2 day)
AND max(created_at) < date_sub(now(), interval 1 day)
可以像這樣翻譯成雄辯的查詢
$havingClause = 'count(*) > ? AND min(created_at) < ? AND max(created_at) < ?';
$havingClauseBindings = [
2,
Carbon::now()->subDays(2)->toDateTimeString(),
Carbon::now()->subDays(1)->toDateTimeString()
];
$customers = Customer::where('provider', 'facebook')
->groupBy('email')
->havingRaw($havingClause, $havingClauseBindings)
->get();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.