【问题标题】:How to count the rows by created_at columns with two tables in laravel query builder or eloquent?如何在 laravel 查询构建器或 eloquent 中通过 created_at 列计算行数?
【发布时间】:2017-08-27 11:36:00
【问题描述】:

我有 call_logs 和 jobseekers 表。两个表都有 created_at 列。call_logs 表中有 jobseeker_id。

在 Jobseeker.php 中

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

在 Calllog.php 中

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

我想展示一个像

这样的表格

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
                            

所以,我可以跟踪记录,每天有多少 call_log 和多少新求职者。 这是我在一张表中尝试的方法,效果很好。但我想一次查询两张表,

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

它可以显示给我,比如

created_at                        calllogs
----------------------------------- ----------
2017-08-03                            2
2017-08-04                             3
2017-08-05                            8
2017-08-06                            6
所以请指导我怎么做?我应该使用联合吗?提前致谢。

【问题讨论】:

  • 向我们展示您的模型和关系。
  • 我更新了,请检查一下,@Don'tPanic

标签: php mysql sql laravel laravel-eloquent


【解决方案1】:

有两种方法可以解决这个问题。两者都需要一些编码。

首先,您进行 2 个不同的查询,例如也进行此查询。

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

现在您按天对齐计数并将其显示在表格中。

另一种选择是查询每一天并计算当天的通话记录和求职者的条目。

$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 ];
}

这里 $counts 包含范围内每天的求职者人数和通话记录。

【讨论】:

  • 嗨,兄弟,非常感谢您的详细解释,第一个,我试过 dd($count2),它显示为“SQLSTATE[42000]:语法错误或访问冲突:1140 在没有 GROUP BY 的聚合查询,SELECT 列表的表达式 #1 包含非聚合列 'neh_thit_app.calllogs.created_at';这与 sql_mode=only_full_group_by 不兼容(SQL:select created_at,count(*) as calllogs from calllogs)"
  • 第二个,试了一下 dd($counts) ,它显示像“(1/1) FatalThrowableError Call to a member function copy() on string”,我不明白 copy()意思也是,能否请您再帮我检查一下,再次感谢您的热心帮助。
  • 抱歉有错别字,没有在真实应用程序中测试就发自内心地应对。使用 Copy() 以便不修改 Carbon 实例。修改代码,使 $dates 数组现在具有 Carbon 实例而不是字符串。还修改了第一个示例并作为 created_at 添加到 group by 子句。
  • 嗨兄弟,再次感谢您的修复,我尝试了第一个,它显示为“(2/2)QueryException SQLSTATE [42000]:语法错误或访问冲突:1064 你有一个SQL 语法错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的“as created_at”附近使用正确的语法(SQL:select created_at, count(*) as jobseekers from jobseekers group by CAST(created_at AS DATE) as created_at)" 再次
  • 对于第二个选项,它显示为“ (1/1) FatalThrowableError 类型错误:传递给 Illuminate\Database\Query\Builder::whereBetween() 的参数 2 必须是数组类型,对象给定的,在第 77 行的 /var/www/html/jobapp/app/Http/Controllers/ChecklistController.php 中调用”,兄弟有什么想法吗?请帮我重新修复它。
猜你喜欢
  • 2018-03-19
  • 2020-03-19
  • 1970-01-01
  • 1970-01-01
  • 2020-02-07
  • 2016-03-30
  • 2016-02-09
  • 1970-01-01
  • 2019-09-06
相关资源
最近更新 更多