Показаны записи, которых еще нет в сводной таблице - PullRequest
0 голосов
/ 05 июня 2018

У меня есть таблица «Пользователь», «Студент», «Курс» и «Предмет»

В таблице «Студент» есть user_id. Я установил отношение один к одному, потому что студент является пользователем.

Так что в моемРегистрация студентов У меня есть функция создания, которая получает все предметы курса, которые этот студент в настоящее время записал, и я сделал это так:

public function create()
{
    $user_id = Auth::user()->id;
    $student_id = Student::where('user_id', $user_id)->first();
    $course = $student_id->course->id;
    $subjects = Subject::where('course_id', $course)->get();
    return view('student.create', compact('subjects'));
}

Вид выглядит следующим образом:

{!! Form::open(['method' => 'POST', 'action'=>'StudentRegistration@store', 'files'=>true]) !!}
    @foreach($subjects as $subject)
    <div class="label-box">
        {!! Form::label('subject_id', $subject->name) !!}
        {!! Form::checkbox('subject_id[]', $subject->id, null, ['class'=>'form-control']) !!}
    </div>
    @endforeach
    <div class="form-group">
        {!! Form::submit('Create User', ['class'=>'btn btn-primary']) !!}
    </div>      
{!! Form::close() !!}

Затем в методе store мне удается обновить сводную таблицу (student_subject)

  public function store(Request $request)
  {
    $data = $request->except('_token');
    $subject_count = count($data['subject_id']);
    for($i=0; $i < $subject_count; $i++){
       $student = Student::where('user_id', Auth::user()->id)->first();
       $student->subjects()->attach($data['subject_id'][$i]);
    }

Однако я заметил, что даже при том, что студент зарегистрирован по определенному предмету, этот же предмет все еще отображается в представлении индекса регистрации, что приведет его к двойной регистрации.

Итак, как я могу просмотреть только предметы того курса, к которому принадлежит студент, и которые еще не включены в сводную таблицу?

Ответы [ 3 ]

0 голосов
/ 05 июня 2018
   Route::get('/studentsubjects', function(){
        $student_id = Student::where('user_id', Auth::id())->first();
        $course = $student_id->course->id;
        $subjects = json_decode($student_id->subjects);
        $subjects2 = json_decode(Subject::where('course_id', $course)->get());
        $subjectsUserNotRegisterd= array_udiff($subjects , $subjects2, function ($obj1, $obj2) {
            return $obj1->id-$obj2->id;
        });
        echo "<pre>", print_r($subjectsUserNotRegisterd, 1);
    });

Результат:

Array
(
    [3] => stdClass Object
        (
            [id] => 5
            [course_id] => 1
            [lecturer_id] => 1
            [code] => Nss101
            [name] => Network Systems
            [created_at] => 2018-05-31 17:43:08
            [updated_at] => 2018-05-31 17:43:08
        )

)
0 голосов
/ 07 июня 2018

Я изменил свой маршрут на следующий код, используя документы laravel, и он работает просто отлично:

Route::get('/studentsubjects', function(){
    $student_id = Student::where('user_id', Auth::id())->first();
    $course = $student_id->course->id;
    $all_subjects = $student_id->subjects;

    $selected_subjects = Subject::where('course_id', $course)->get();

    $nonregistered_subjects = $selected_subjects->diff($all_subjects);

    foreach ($nonregistered_subjects as $nonregistered) {
        echo $nonregistered->name;
    }
});
0 голосов
/ 05 июня 2018

Поскольку вы работаете с коллекциями Laravel, я бы предложил использовать следующий метод, данный Laravel.

https://laravel.com/docs/5.6/collections#method-diffassoc

Надеюсь, это поможет вам решить вашу проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...