Laravel带条件的联接查询

时间:2018-09-03 11:37:11

标签: laravel query-builder jointable laravel-query-builder

我有4张桌子。

用户表:

id    col1     col2

分配的课程表:

id    user_id      course_id       approved 

CourseInfo 表:

id     parent_id 

CourseParents 表:

id    start_date      end_date

我认为表名及其列名很容易说明。

我有2种用户-i)已分配ii)未分配。我在2个不同的页面中显示它们。

在显示分配的学生时,我需要用户表中的那些学生,因为每个人的 CoursesAssigned 表中至少一行 user_id是他自己的用户ID,approved字段是1,并且该行中的course_id具有自己的parent_id(来自 CourseInfo end_date(来自 CourseParents )大于或等于今天。

要显示未分配的学生,我需要用户表中的那些学生,每个人-

两个

CoursesAssigned 表中有 NO 行,其中user_id是他自己的用户ID,而approved列的值为1。是针对未分配的用户的,则可能存在一行具有其自己的用户ID的行,但approved字段包含0。

CoursesAssigned 表中可能存在行,其中user_id是他自己的用户ID,而approved字段的值为1,但是parent_id是从 CourseInfo (CourseInfo )从 CourseParents 中获得的end_date小于今天的日期。

我可以为分配的学生编写查询,例如:

    $date=date('Y-m-d');

    $records = User::join('CoursesAssigned','users.id','=','CoursesAssigned.user_id')
                 ->join('CourseInfo','CourseInfo.id','=','CoursesAssigned.course_id')
                  ->join('CourseParents','CourseParents.id','=',
'CourseInfo.parent_id')
                  ->where('CoursesAssigned.approved','=',1)
                  ->where('CourseParents.end_date','>=',$date)
                  ->select('users.id','users.col1','users.col2')
                  ->orderBy('users.id','desc');

但这不会产生正确的结果,因为它不会在最少 1行中检查 CoursesAssigned 表中是否满足上述所有条件。 Q1)还是应该?

Q2)仅获取未分配学生的查询又如何呢?

编辑:答案可以是ORM,查询生成器甚至是Laravel格式的原始MySql。

EDIT2:让我在这里说明情况: 我需要分别获取已分配和未分配的用户。

要获得分配的用户,我有1条规则:如何获得在 CoursesAssigned 表和父级表(从 CourseInfo 表中获得)至少具有1个已批准课程的用户)的结束日期(在 CourseParents 表中)大于或等于今天。

要获得未分配的学生,我有2条规则:

规则1:获取那些没有任何已批准课程的学生(即所有课程都已批准= 0)。他们是未分配的学生

规则2:让那些已批准课程但没有一个批准课程符合分配学生标准的学生。这意味着那里没有批准的课程,其家长的结束日期大于或等于今天,他们也是未分配的学生。

1 个答案:

答案 0 :(得分:0)

我仍然不确定您与表之间的关系,但是据我的猜测,我想出了以下解决方案,首先使用Eloquent模型创建关系:

用户模型(用于usres表):

namespace App;

use App\Course;
use Illuminate\Notifications\Notifiable;
use Illuminate\Foundation\Auth\User as Authenticatable;

class User extends Authenticatable
{
    use Notifiable;

    public function courses()
    {
        return $this->hasMany(Course::class);
    }
}

课程模型(用于CoursesAssigned表):

namespace App;

use App\CourseInfo;
use Illuminate\Database\Eloquent\Model;

class Course extends Model
{
    protected $table = 'CoursesAssigned';

    public function courseInfo()
    {
        return $this->belongsTo(CourseInfo::class);
    }
}

CourseInfo模型(用于CourseInfo表):

namespace App;

use App\CourseParent;
use Illuminate\Database\Eloquent\Model;

class CourseInfo extends Model
{
    protected $table = 'CourseInfo';

    public function courseParent()
    {
        return $this->belongsTo(CourseParent::class, 'parent_id');
    }
}

CourseParent模型(用于CourseParents表):

namespace App;


use Illuminate\Database\Eloquent\Model;

class CourseParent extends Model
{
    protected $table = 'CourseParents';

}

获取分配的用户:

$assignedUsers = User::whereHas('courses', function($query) {
    $query->where('approved', 1)
          ->with(['courses.courseInfo.courseParent' => function($query) {
              $query->where('end_date', >= \Carbon\Carbon::now());
          }]);
})->get(); // paginate(...) for paginated result.

如果我的假设正确,这应该可以工作。首先尝试assignedUsers,然后让我知道,然后我将针对其他要求进行研究。还要确保您了解模型之间的雄辩关系,并正确地实现所有事情(使用正确的名称空间)。


注意:此答案是不完整的,需要进一步的信息,因为该答案是通过电话与OP直接交谈的结果(OP叫我,因为我可以联系到我),因此如果需要,我们会加班进行一些更改。继续逐步进行,直到我提出解决方案或留下解决方案为止。