Laravel连接查询条件

问题描述 投票:-1回答:1

我有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表中没有行,其中user_id是他自己的用户ID,approved列的值为1.对于未分配的用户,可能存在一行具有自己的用户ID但approved字段包含0。

要么

CoursesAssigned表中可能有行,其中user_id是他自己的用户ID,approved字段的值为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');

但是,这不应该产生正确的结果,因为它不会检查CoursesAssigned表至少满足所有提到的标准的1行。 Q1)还是应该呢?

Q2)只提取未分配学生的查询是什么?

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

EDIT2:让我在这里澄清一下这个场景:我需要分别获取已分配和未分配的用户。

为了获得分配的用户,我有1条规则:如何获得在CoursesAssigned表中至少拥有1个已批准课程的用户以及该课程的父(从CourseInfo表获得)的end_date(在CourseParents表中)大于或等于今天。

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

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

规则2:获得批准课程的学生,但没有一个经批准的课程符合指定学生的标准。这意味着那里没有经过批准的课程,其父母的end_date大于或等于今天。他们也是未分配的学生。

laravel query-builder jointable laravel-query-builder
1个回答
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,然后告诉我,然后我会查看其他要求。还要确保您了解模型之间的Eloquent关系并正确实现所有内容(使用正确的命名空间)。


注意:这个答案是不完整的,需要进一步的信息,因为答案是与OP通过电话直接对话的结果(OP称我为因为我可以到达)所以如果需要,将会加班加点,并将继续一步一步,直到我可以提出解决方案或离开它。

© www.soinside.com 2019 - 2024. All rights reserved.