Şimdi bir tane
calls isimli çağrıları tutan bir tablonuz olsun:
+----+-------------+--------------+---------------+---------------------+
| id | operator_id | caller | call_number | call_time |
+----+-------------+--------------+---------------+---------------------+
| 1 | 5 | Ahmet Ekmez | +905551234567 | 2017-07-11 10:01:45 |
| 2 | 23 | İsmail Gören | +905557654321 | 2017-07-11 10:05:12 |
+----+-------------+--------------+---------------+---------------------+
Tekrar aramaları tutacak bir de
redials isimli tablonuz olsun:
+----+-------------+---------+---------------------+
| id | operator_id | call_id | redial_time |
+----+-------------+---------+---------------------+
| 1 | 5 | 1 | 2017-07-11 10:15:00 |
| 2 | 23 | 2 | 2017-07-11 10:20:00 |
+----+-------------+---------+---------------------+
Şu sorgu size arama zamanı geçen tekrar aramaları verecektir:
DB::table('redials')->whereRaw('redial_time > CURDATE()')->get();
Şöyle bir şey yapabilirsiniz: Hazırladığınız sistemde sağ üst köşede bir tane alarm simgesi ve zamanı gelmiş (ve geçmiş) yapılması gereken tekrar aramalar yazsın. Tıklayınca da tekrar yapılması gereken aramaları listeleyen
/redials sayfası açılsın.
<a href="/redials">
<i class="fa fa-bell"></i>
<span id="redialCount">5</span>
</a>
Bir controllerda bize bu sayıyı (mevcut giriş yapmış operatöre göre) verecek bir yöntemimiz olsun. Bu sayıyı nasıl alacağınız size kalmış, User ile one-to-many ilişkisi de kurabilirsiniz vs vs.
Javascript kullanacağız o yüzden json alalım. Ayrıca
redial_count_{operator_id} isimli önbellek anahtarı ile de bu sayısı önbellekte tutacağız. redials tablosuna yeni bir tekrar arama eklendiğinde bu redial_count önbelleğini Cache::forget('redial_count_5'); ile silmelisiniz ki yeni sayı ile baştan oluştursun. Sondaki 5 operator_id oluyor.
// App\Http\Controllers\Admin\RedialController::redialsCount()
public function getRedialCount(Request $request)
{
/** @var string $cacheKey Mevcut kullanıcıya özel önbellek anahtarı */
$cacheKey = 'redial_count_' . $request->user()->id;
$count = Cache::get($cacheKey, function () {
return DB::table('redials')->where('operator_id', $request->user()->id)->whereRaw('redial_time > CURDATE()')->count();
});
return response()->json([
'count' => $count
]);
}
Bunu da bir rotaya bağlayalım:
Route::get('admin/redials/count')->uses('Admin\RedialController@getRedialCount');
Şimdi de jQuery kullandığınızı varsayarak periyodik çağrı ile her 30 saniyede yapılması gereken yeniden arama sayısını alalım ve ekranın sağ üst köşesinde çan simgesinin üstünde gösterelim:
$(function() {
function updateRedialCount() {
$.get('/admin/redials/count', function(response) {
$('#redialCount').text(response.count);
});
setTimeout(updateRedialCount, 30000);
}
updateRedialCount();
});
Operatör yeniden aramayı yaptıktan sonra redials tablosundan kaydı silecek. Bu sırada redial_count_5 anahtarlı önbelleğini de tekrar siliyorsunuz.
Bu kabaca, cron ya da node.js kullanmadan hemen uygulayabileceğiniz eski usül bir konsept. Burada cache kullandım ama bence gerek var mı? Yok. Size yol göstermesi açısından.