Php 将Symfony查询转换为Laravel 6.x雄辩查询

Php 将Symfony查询转换为Laravel 6.x雄辩查询,php,laravel,symfony,symfony-3.4,laravel-6.2,Php,Laravel,Symfony,Symfony 3.4,Laravel 6.2,我目前正在将Symfony 3.4站点迁移到Laravel 6.x,我正在寻找将此查询转换为Laravel雄辩查询的正确方法 这是Symfony查询 $qb = $this->createQueryBuilder('up'); $qb->select('COUNT(up.id)'); $qb->leftJoin('up.workout', 'w') ->leftJoin('up.user', 'u') ->where('up.p

我目前正在将Symfony 3.4站点迁移到Laravel 6.x,我正在寻找将此查询转换为Laravel雄辩查询的正确方法

这是Symfony查询

 $qb = $this->createQueryBuilder('up');
 $qb->select('COUNT(up.id)');
 $qb->leftJoin('up.workout', 'w')
        ->leftJoin('up.user', 'u')
        ->where('up.parent IS NULL AND up.deleted = false')
        ->andWhere('up.status != \'Just started\' OR up.status is NULL')
        ->andWhere('w.workoutType = \'Normal\' AND u.deleted = false')
        // Long Cardio, Long Cardio (Burn) and Long Cardio (Hardcore)
        ->andWhere('up.completed = true OR (up.completed_cardio_shred = true AND ((w.level = \'Long Cardio\') OR (w.level = \'Long Cardio (Burn)\') OR (w.level = \'Long Cardio (Hardcore)\')))');
  $qb->getQuery()->getSingleScalarResult();
这是我使用Laravel6.xDB查询生成的

 $userProgressTable = DB::table('user_progress');
    $userProgressTable->select('id');
    $userProgressTable->leftJoin('fos_user', 'fos_user.id', '=', 'user_progress.user_id');
    $userProgressTable->leftJoin('workout', 'workout.id', '=', 'user_progress.workout_id');
    $userProgressTable->whereRaw('user_progress.parent_id IS NULL');
    $userProgressTable->where('user_progress.deleted', '=', false);
    $userProgressTable->whereRaw('user_progress status <> \'Just started\' OR user_progress.status IS NULL');
    $userProgressTable->where('workout.workout_type', '=', 'Normal');
    $userProgressTable->where('user.deleted', '=', false);
    $userProgressTable->whereRaw('user_progress.completed = true OR (user_progress.completed_cardio_shred = true AND ((workout.level = \'Long Cardio\') OR (workout.level = \'Long Cardio (Burn)\') OR (workout.level = \'Long Cardio (Hardcore)\'))');
    $userProgressTable->where('user_progress.user_id', '=', $user->id);
    return $userProgressTable->count();
$userProgressTable=DB::table('user_progress');
$userProgressTable->select('id');
$userProgressTable->leftJoin('fos_user','fos_user.id','=','user_progress.user_id');
$userProgressTable->leftJoin('workout','workout.id','=','user\u progress.workout\u id');
$userProgressTable->whereRaw('user\u progress.parent\u id为NULL');
$userProgressTable->where('user_progress.deleted','=',false);
$userProgressTable->whereRaw('user_progress status'Just start\'或user_progress.status为NULL');
$userProgressTable->where('workout.workout_type','=','Normal');
$userProgressTable->where('user.deleted','=',false);
$userProgressTable->whereRaw('user\u progress.completed=true或(user\u progress.completed\u cardio\u shred=true和('workout.level='Long cardio\')或(workout.level='Long cardio(Burn)\')或(workout.level='Long cardio(Hardcore)\');
$userProgressTable->where('user\u progress.user\u id','=',$user->id);
返回$userProgressTable->count();

我的问题是,如果我使用雄辩的模型/查询方式,上面的查询会是什么样子?

首先,您必须拥有模型类本身,并正确设置任何关系。从您共享的代码中,我看到了三个独立的模型。通常您希望每个表有一个模型,但这也有点依赖于表。您例如,透视表不需要一个透视表(但您可以有一个透视表)

您可以随意命名这些类,它们不必与表名匹配(有关详细信息,请参阅文档:)

然后将您的关系添加到每个需要它们的模型(),然后您就可以开始查询了。它可以如下所示:

$result = UserProgress::join('fos_user', 'fos_user.id', '=', 'user_progress.user_id')
    ->join('workout', 'workout.id', '=', 'user_progress.workout_id')
    ->whereRaw('...')
    ...
    ->where('user_progress.user_id', '=', $user->id)
    ->get(); // this returns a Collection object

return $result->count(); // This is a Collection method
这只是一个例子,有很多方法可以构造where子句(
where('user_id','=',$user.id)
vs
whereUserId($user.id)
),但应该足以让您开始


此外,对于这个特定的查询,您实际上只需要第一个模型,但很可能最终会使用其他两个表的模型。

您可以通过雄辩的关系雄辩地完成查询。您(以及框架的每个用户)需要的是停止重新发明轮子,使用正确的SQL。我的2美分。
$result = UserProgress::join('fos_user', 'fos_user.id', '=', 'user_progress.user_id')
    ->join('workout', 'workout.id', '=', 'user_progress.workout_id')
    ->whereRaw('...')
    ...
    ->where('user_progress.user_id', '=', $user->id)
    ->get(); // this returns a Collection object

return $result->count(); // This is a Collection method