Laravel使用带有联接的查询生成器上的位置进行计数

时间:2018-06-20 16:31:20

标签: mysql laravel

大家好,我试图计算表中的所有记录,但前提是该表不包含特定列(deleted_at)中的数据。它是一个联接表,表名是公司和雇员。我目前正在使用DB :: raw来计数记录,但是只有在delete_at列为null时,它才应该对其进行计数。请了解我是一个初学者。

public function index()
  {
    $user = Auth::user()->id;

    $companies = DB::table('companies AS c')
      ->select([
        'c.id',
        'c.logo',
        'c.company_name',
        'c.created_at',
        'c.sector',
        'c.deleted_at',
        DB::raw('COUNT(e.id) AS employee_count')
      ])
      ->leftJoin('employees AS e', 'e.company_id', '=', 'c.id' )
      ->leftJoin('company_user AS cu', 'cu.company_id', '=', 'c.id')
      ->where('cu.user_id', '=', $user)
      ->where('c.deleted_at', '=', null)
      ->groupBy('c.id')
      ->get();

    return view('account.companies.index')
      ->with('companies', $companies);
  }

1 个答案:

答案 0 :(得分:3)

如果您使用的是Mysql,则可以使用条件聚合

$companies = DB::table('companies AS c')
  ->select([
    'c.id',
    'c.logo',
    'c.company_name',
    'c.created_at',
    'c.sector',
    'c.deleted_at',
    DB::raw('SUM(c.deleted_at IS NULL) AS employee_count')
  ])
  ->leftJoin('employees AS e', 'e.company_id', '=', 'c.id' )
  ->leftJoin('company_user AS cu', 'cu.company_id', '=', 'c.id')
  ->where('cu.user_id', '=', $user)
  ->groupBy('c.id')
  ->get();

在mysql中,当在sum(a = b)内使用表达式时,结果将为布尔值0/1,因此您可以使用上面的条件计数

或者您可以在查询中使用whereNull()方法

->whereNull('c.deleted_at')