我有4张桌子。
用户表:
id col1 col2
课程分配表:
id user_id course_id approved
课程信息表:
id parent_id
课程家长表:
id start_date end_date
我认为表名及其列名是不言自明的。
我有2种用户-i)分配ii)未分配。我在2个不同的页面中显示它们。
在显示分配的学生时,我需要来自用户表的那些学生,其中每个人在课程分配表中至少有一行,其中< code>user_id是他自己的用户id,并且< code>approved字段为1,该行中的< code>course_id有其自己的< code>parent_id(来自CourseInfo),其中< code>end_date(来自CourseParents)大于或等于今天。
为了显示未分配的学生,我需要users表中的学生,每个学生-
要么
CoursesAssigned表中没有行,其中user_id
是他自己的用户id,而approved
列的值为1。也就是说,对于未分配的用户,可能存在具有自己用户id的行,但approved
字段包含0。
或者
CoursesAssigned 表中可能存在行,其中user_id
是他自己的用户 ID,批准
字段的值为 1,但从 CourseInfo 获得的parent_id
从 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行符合所有提到的标准的课程分配表。Q1)还是应该这样?
Q2) 仅获取未分配学生的查询是怎么回事?
编辑:答案可以是ORM,查询生成器,甚至是Laravel格式的原始MySql。
编辑2:让我在这里澄清一下场景:我需要分别获取已分配和未分配的用户。
要获取分配的用户,我有 1 条规则:如何获取那些在课程分配表中至少有 1 门已批准课程的用户,并且该课程的父级(从课程信息表获得)的end_date(在课程家长表中)大于或等于今天。
要获得未分配的学生,我有两条规则:
规则1:获取那些没有任何批准课程的学生(即所有课程都已批准=0)。他们是未分配的学生
规则2:获得已批准课程但未批准课程符合已分配学生标准的学生。这意味着那里没有批准的课程的父母end_date大于或等于今天。他们也是未分配的学生。
我仍然不能完全确定您的表关系,但根据我的猜测,我想到了以下解决方案,首先使用< code > concertive 模型创建关系:
用户模型(用于用户
表):
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);
}
}
课程模型(用于CoursesAssign
表):
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模型(用于< code>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.
如果我的假设是正确的,这应该有效。首先为分配的用户
尝试此操作,然后让我知道,然后我会研究其他要求。还要确保您确实了解模型之间的雄辩关系,并正确实现所有内容(使用正确的命名空间)。
注意:此答案不完整,需要进一步的信息,因为答案是通过电话与OP
直接对话的结果(OP打电话给我,因为我可以联系到我),因此如果需要,将超时进行一些更改,并将一步一步地继续,直到我能够提出解决方案或离开它。