2017-08-27 2 views
1

J'ai les tables call_logs et jobseekers. Les deux tables ont created_at column.And il y a jobseeker_id dans la table call_logs.Comment compter les lignes par les colonnes created_at avec deux tables dans le générateur de requête laravel ou éloquent?

Dans Jobseeker.php

public function calllogs() 
{ 
    return $this->hasMany('App\Calllog','jobseeker_id'); 
} 

Dans Calllog.php

public function jobseeker() 
{ 
    return $this->belongsTo('App\Jobseeker','jobseeker_id'); 
} 

Je veux montrer une table comme

created_at       call_logs   jobseekers       
 
----------------------------------- --------------------------------- 
 
2017-08-05        1     3 
 
2017-08-04        2     2 
 
2017-08-03        3     1 
 
2017-08-02        2     4 
 
2017-08-01        5     8 
 
         

Donc, je peux suivre le record, combien de call_logs et combien de nouveaux demandeurs d'emploi dans chaque jour. Voici comment je l'ai essayé dans une table, son travail well.But Je veux faire deux tables à la fois la requête,

$count = DB::table('calllogs') 
     ->select('created_at', DB::raw('count(*) as calllogs')) 
     ->get(); 

il peut me montrer, comme

created_at      calllogs 
 
----------------------------------- ---------- 
 
2017-08-03       2 
 
2017-08-04        3 
 
2017-08-05       8 
 
2017-08-06       6
Alors s'il vous plaît guide-moi un moyen de faire? Devrais-je utiliser l'union? Merci d'avance.

+0

Montrez-nous vos modèles et relations. –

+0

J'ai mis à jour, s'il vous plaît vérifier, @ Don'tPanic –

Répondre

0

Il existe deux façons d'aborder cette question. Les deux nécessitent un peu de codage.

Tout d'abord, vous faites 2 requêtes différentes, par exemple faites également cette requête.

$count2 = DB::table('jobseekers') 
     ->select(DB::raw('DATE(created_at) as created_at'), DB::raw('count(*) as jobseekers'))  
     ->groupBy(created_at')) 
     ->get(); 

Maintenant, vous alignez les comptages par jour et affichez-les dans le tableau.

L'autre option consiste à effectuer une requête pour chaque jour et à compter les entrées pour les journaux d'appels et les demandeurs d'emploi ce jour-là.

$start_date = Carbon::now()->subWeek(); 
$end_date = Carbon::now()->now(); 
$dates  = []; 

for ($date = $start_date; $date->lte($end_date); $date->addDay()) { 
    $dates[] = $date); 
} 

$counts = []; 
foreach ($dates as $date) { 
    $dateLater       = $date->copy()->addDay(); 
    $callLogs       = Calllog::whereBetween([$date, $dateLater])->count(); 
    $jobSeekers       = Jobseeker::whereBetween([$date, $dateLater])->count(); 
    $counts[ $date->format('Y-m-d') ] = [ $callLogs, $jobSeekers ]; 
} 

Ici, count compte le nombre de demandeurs d'emploi asd calllogs pour chaque jour d'intervalle.

+0

Salut bro, merci beaucoup pour votre explication de détail, le premier, j'ai essayé et dd ($ count2), son affichage comme "SQLSTATE [42000]: Erreur de syntaxe ou violation d'accès: 1140 Dans une requête agrégée sans GROUP BY, l'expression # 1 de la liste SELECT contient une colonne non agrégée 'neh_thit_app.calllogs.created_at', ce qui est incompatible avec sql_mode = only_full_group_by (SQL: sélectionnez 'created_at', count (*) comme calllogs de 'calllogs')" –

+0

le second, l'a essayé et dd ($ compte), il montre comme "(1/1) FatalThrowableError Appel à une fonction membre copy() sur la chaîne", je ne comprends pas que copy() signifie aussi, pouvez-vous s'il vous plaît m'aider à le vérifier à nouveau, merci encore pour votre aimable aide. –

+0

Désolé pour les fautes de frappe, faire face de cœur sans test dans la vraie application. Copy() est utilisé pour que l'instance Carbon ne soit pas modifiée. Code modifié pour que $ dates array ait maintenant des instances Carbon au lieu de chaînes. Le premier exemple modifié a également été ajouté en tant que created_at à la clause group by. –