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

时间:2018-08-29 14:00:24

标签: php laravel eloquent laravel-5.6

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

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

}

具有锚表parent_student和带列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');
  }
}

我要实现的目标是为一个班级(例如班级1)的学生获得家长的电子邮件地址,我将classId从视图中的下拉列表中以视图的形式传递给控制器​​。

这是我的控制者。

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还是很陌生,这是我到目前为止所走的路。任何建议都将不胜感激。(我正在使用laravel 5.6)

2 个答案:

答案 0 :(得分:3)

此行

$parents->students

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

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

接下来,您尝试访问->classId中的$parent->students,这是同样的问题。 $parent->studentsCollection,而不是单个Student 2 模型。您需要另一个循环来获取classId

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

但是,这仍然不能解决您的核心问题。了解何时访问Collection和单个Model至关重要,因此请记住这一点。

除了所有这些,听起来您正在尝试让$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表中查询所有班级ID为$class的学生记录。

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

旁注:您在classes()上的Student关系存在问题。由于它是belongsTo()方法,因此应为class()(单数),因为$student->classes仅会返回单个Class模型。


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

答案 1 :(得分:0)

尝试此查询:

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

代替:

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

然后使用die($parents)代替dd($parents)