属性 [students] 在此集合实例上不存在

Property [students] does not exist on this collection instance

所以我在 parents 模型上声明了关系

 <?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Parents extends Model
{
  protected $fillable = [
      'firstName',
      'middleName',
      'lastName',
      'phoneNumber',
      'gender',
  ];
  public function students(){
    return $this->belongsToMany('App\Student','parent_student','parentId','studentId');
  }

}

锚点 table parent_student 和学生 table 列 classId。这是学生模型

<?php

namespace App;

use Illuminate\Database\Eloquent\Model;

class Student extends Model
{
  //
  protected $fillable = [
    'firstName',
    'middleName',
    'lastName',
    'regNo',
    'gender', 
    'dob',        
    'classId',
  ];

  public function parents(){
    return $this->belongsToMany('App\Parents','parent_student','studentId','parentId');
  }

  public function classes()
  {
    return $this->belongsTo('App\Classes','classId');
  }
}

我想要实现的目标是让 parents 的电子邮件地址与学生合二为一 class 例如 class 1,我将其传递给 classId从视图上表单中的下拉列表 select 到控制器。

这是我的控制器。

public function submitEmail(Request $request)
    {
      $validatedData = $request->validate([
        'class' => 'required|integer',
        'message' => 'string|max:255',
        'subject' => 'string|max:255',
      ]);
      $class = $request->input('class');
      $message = $request->input('message');
      $subject = $request->input('subject');
  $parents = Parents::all();
        $parents = Parents::where($parents->students->classId,"=",$class)->get();
        die($parents);


}

我是 laravel 的新手,这是我已经走了这么远,所以 far.Any 的建议将不胜感激。(我正在使用 laravel 5.6)

试试这个查询:

$parents = Parents::with(['students' => function($query) use ($class){
    $query->where('classId',$class);
}])->get();

而不是:

$parents = Parents::where($parents->students->classId,"=",$class)->get();

然后使用 dd($parents)

而不是 die($parents)

这一行

$parents->students

是你的问题所在。 $parentsCollection(数组)的 Parents 模型,而不是单个 Parents1 模型。要获得单个 classId,您需要使用循环:

foreach($parents AS $parent){
  ... // Should be able to access $parent->students without issue;
}

接下来,您正在尝试访问 $parent->students->classId,这是同一个问题。 $parent->students 是一个 Collection,而不是一个单一的 Student2 模型。你需要另一个循环来获得 classId:

foreach($parents AS $parent){
  foreach($parent->students AS $student){
    ... // Should be able to access `$student->classId` without issue
  }
}

但是,这仍然没有解决您的核心问题。了解您访问 Collection 与访问单个 Model 的时间很重要,因此请牢记这一点。

除此之外,听起来您正试图让 $class 的 Class 中的所有学生家长(从您的 <form> 传递)。为此,您可以使用 ->whereHas(),如下所示:

$parents = Parents::whereHas("students", function($query) use($class){
  $query->where("classId", "=", $class);
})->with(["students" => function($query) use($class){
  $query->where("classId", "=", $class);
}])->get();

它的作用是在 parents table 中查询任何具有 class 且 ID 为 $class 的学生记录。

请注意,whereHaswith 包含相同的子查询来约束和急切加载 Students 的每个 Parents 集合到所需的内容。

旁注:您在 Student 上的 classes() 关系有问题。因为它是一个 belongsTo() 方法,所以它应该是 class()(单数),因为 $student->classes 只会 return 一个单一的 Class 模型。


1 注意命名规范。 Parents 应该是 Parent;模型名称是单数。
2 您为 Student 模型命名正确,所以要保持一致。