Laravel Eloquent 5 табличных отношений и предложение where - PullRequest
0 голосов
/ 21 марта 2019

Мне нужно подключиться. 5 Таблицы. Вот моя структура базы данных. enter image description here

1) связь между школами и классами: много ко многим 2) пользователь может принадлежать ко многим школам и множеству классовза один раз (например, учитель может преподавать несколько классов в нескольких школах одновременно), поэтому для удовлетворения этого я использовал принадлежность таблица

вот пример данных для таблицы

**users**                 **affiliation**      **class_school**
-----------------------  -------------------  -----------------------------
| id      | name      |  | user_id  | cs_id | | id  | s_id  | c_id |room_no|
| 1       | steve     |  | 1        | 1     | | 1   | 1     | 1    | A1    |
| 2       | andrew    |  | 1        | 3     | | 2   | 1     | 2    | B23   |
-----------------------  | 2        | 2     | | 3   | 2     | 1    | 01    |
----------------------   -------------------  -----------------------------

**schools**                   **classes**
-------------------------   ---------------
| id   | name  |address |   | id  | name   |
| 1    | a     | abcd   |   | 1   | prep   |
| 2    | b     | efgh   |   | 2   | KG     |
------------------------- ------------------

теперь мне нужно опросить пользователей 1) принадлежащих к определенному классу в конкретной школе

в модели пользователя я установил отношение к принадлежности, как

public function affiliation(){
    return $this->hasMany(AffiliationModel::class,'u_id');
}

и в модели принадлежности

public function schools(){
    return $this->belongsToMany(SchoolsModel::class,'class_school','id','s_id','cs_id');
}

с помощью этого я могу отфильтровать школы, используя код

UserModle::whereHas("affiliation.schools",function($q){$query->where('schools.id',1)})->get()

, но для этого также 1 -) возвращаются все пользователи.но без информации о школе 2 -) как я буду запрашивать, хочу ли я получить пользователей из какого-либо конкретного класса конкретной школы на данный момент, используя сборку запросов: |

DB::table('users')
        ->select('users.id','users.name','users.email','users.gender','users.dob','users.active')
        ->selectRaw(' CONCAT ( CONCAT(schools.name,\'##\',schools.id),\'---\',
            GROUP_CONCAT(
                DISTINCT CONCAT(
                    classes.name,\'#\',classes.id
                )
                SEPARATOR \'||\'
            )
        )
            as schools')
        ->join('affiliation','affiliation.u_id','=','users.id')
        ->join('class_school','class_school.id','=','affiliation.cs_id')
        ->join('schools','schools.id','=','class_school.s_id')
        ->join('classes','classes.id','=','class_school.c_id')
        ->groupBy('users.id')->groupBy('schools.id');

я хочу получить b как в формате

[
    {
        "id": 1,
        "name": steve,
        "school": [{
            "id": 1,
            "name": "a",
            "address":"abcd",
            "classes":[
                {
                "id":1,
                "name":prep
               },
               {
                "id":2,
                "name":kg
               }
             ]
        }] 
    }
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...