Laravel присоединиться к запросу с условиями - PullRequest
0 голосов
/ 03 сентября 2018

У меня 4 таблицы.

Пользователь Таблица:

id    col1     col2

CoursesAssigned таблица:

id    user_id      course_id       approved 

CourseInfo таблица:

id     parent_id 

курс родителей стол:

id    start_date      end_date

Я думаю, что имена таблиц и имена столбцов не требуют пояснений.

У меня есть 2 типа пользователей: i) назначенные ii) неназначенные. Я показываю их на 2 разных страницах.

При отображении назначенных учеников мне нужны ученики из пользователей таблицы, для каждого из которых есть не менее одна строка в CoursesAssigned таблица, где user_id это его собственный идентификатор пользователя, и поле approved равно 1, а course_id в этой строке имеет свой собственный parent_id (из CourseInfo ) с end_date (из CourseParents ) больше или равно сегодняшнему дню.

Для отображения неназначенных учеников мне нужны ученики из пользователей таблицы, для каждого из которых -

* * Либо тысяча сорок-девять

есть строка NO в таблице CoursesAssigned , где user_id является его собственным идентификатором пользователя, а столбец approved имеет значение 1. То есть для неназначенного пользователя, может существовать строка с его собственным идентификатором пользователя, но поле approved содержит 0.

или

могут быть строки в таблице CoursesAssigned , где user_id является его собственным идентификатором пользователя, а поле approved имеет значение 1, но parent_id получено из 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');

Но это не должно приводить к правильному результату, поскольку при этом не проверяется таблица CoursesAssigned для строки не менее 1, которая соответствует всем указанным критериям. Q1) Или это должно быть?

Q2) Как насчет запроса, который выбирает только неназначенных студентов?

РЕДАКТИРОВАТЬ: Ответ может быть в ORM, построитель запросов или даже необработанный MySql для формата Laravel.

EDIT2: Позвольте мне прояснить сценарий здесь: Мне нужно получать как назначенных, так и неназначенных пользователей по отдельности.

Чтобы получить назначенных пользователей, у меня есть 1 правило: как получить тех пользователей, у которых есть хотя бы 1 утвержденный курс в таблице CoursesAssigned и родитель (получен из таблицы CourseInfo ) из этот курс имеет дату окончания (в таблице CourseParents ) больше или равна сегодняшнему дню.

Для получения неназначенных студентов у меня есть 2 правила:

Правило 1: Получите тех учеников, у которых нет утвержденного курса (т. Е. Все курсы одобрены = 0). Они не назначенные студенты

Правило 2: Получите тех студентов, которые одобрили курсы, но ни один из утвержденных курсов не соответствует критериям для назначенных студентов. Это означает, что не существует утвержденного курса, в котором есть родитель, чья конечная дата больше или равна сегодняшнему дню. Они также не назначенные студенты.

1 Ответ

0 голосов
/ 05 сентября 2018

Я все еще не совсем уверен в ваших отношениях с таблицами, но, по-моему, я пришел к следующему решению: сначала создайте отношения с использованием 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 позвонил мне, потому что я был доступен), поэтому некоторые изменения будут внесены сверхурочно, если это необходимо, и будут продолжены шаг за шагом, пока я не смогу найти решение или оставить его.

...