【问题标题】:Showing records that are not yet in pivot table显示尚未在数据透视表中的记录
【发布时间】:2018-06-05 09:35:28
【问题描述】:

我有一个用户、学生、课程和主题表

Student 表有 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]);
    }

但是,我注意到即使学生注册了特定科目,注册索引视图中仍会显示同一科目,这将导致他进行双重注册。

那么,我怎样才能只查看学生所属的课程的科目,而这些科目尚未在数据透视表中?

【问题讨论】:

  • 请编辑您的问题并用数组替换图像。
  • @HamzaAbdaoui 我刚刚编辑过
  • 但是你到底想要什么?你能告诉我们想要的输出吗?
  • @WosleyAlarico 那么你有什么尝试?还有什么你不明白?您提到的链接正是您所需要的。如果传递给 array_udiff 的回调对于任何比较都返回零,则当前处理的元素将不在 array_udiff() 返回的数组中。

标签: php laravel


【解决方案1】:

因为你正在使用 Laravel Collections,我建议使用 Laravel 提供的以下方法。

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

希望这能帮助您解决问题。

【讨论】:

  • 您能提供更多详细信息吗?
  • 我使用了提供的链接,现在我只能得到一个对象。 $collection = collect($subjects); $diff = $collection->diff($subjects2);回声 $diff->first();如果我尝试 all 方法它不起作用。
  • 如果我使用 all 方法会出现此错误:“数组到字符串的转换”
  • 在我继续回答之前。您是否试图在两个集合中的活动键上有所不同?例如:两个集合都有“course_id”键,但都没有“pivot”键。如果不是这种情况,我可能会为您提供另一种解决方案。
  • 对于 Wosley Alarico,尽量不要重复你的结果,而是放弃它。你不能回显一个数组。
【解决方案2】:
   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
        )

)

【讨论】:

  • 这给出了一个空数组
  • 它应该给出这样的输出。我已经检查了我的服务器以使用您在问题中提到的输出数组。
【解决方案3】:

我使用 laravel 文档将我的 Route 更改为以下代码,并且效果非常好:

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;
    }
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-05-19
    • 1970-01-01
    • 1970-01-01
    • 2019-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-01-08
    • 2014-03-07
    相关资源
    最近更新 更多