我有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:让那些已批准课程但没有一个批准课程符合分配学生标准的学生。这意味着那里没有批准的课程,其家长的结束日期大于或等于今天,他们也是未分配的学生。
答案 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叫我,因为我可以联系到我),因此如果需要,我们会加班进行一些更改。继续逐步进行,直到我提出解决方案或留下解决方案为止。