属性 [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
是你的问题所在。 $parents
是 Collection
(数组)的 Parents
模型,而不是单个 Parents
1 模型。要获得单个 classId
,您需要使用循环:
foreach($parents AS $parent){
... // Should be able to access $parent->students without issue;
}
接下来,您正在尝试访问 $parent->students
的 ->classId
,这是同一个问题。 $parent->students
是一个 Collection
,而不是一个单一的 Student
2 模型。你需要另一个循环来获得 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
的学生记录。
请注意,whereHas
和 with
包含相同的子查询来约束和急切加载 Students
的每个 Parents
集合到所需的内容。
旁注:您在 Student
上的 classes()
关系有问题。因为它是一个 belongsTo()
方法,所以它应该是 class()
(单数),因为 $student->classes
只会 return 一个单一的 Class
模型。
1 注意命名规范。 Parents
应该是 Parent
;模型名称是单数。
2 您为 Student
模型命名正确,所以要保持一致。
所以我在 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
是你的问题所在。 $parents
是 Collection
(数组)的 Parents
模型,而不是单个 Parents
1 模型。要获得单个 classId
,您需要使用循环:
foreach($parents AS $parent){
... // Should be able to access $parent->students without issue;
}
接下来,您正在尝试访问 $parent->students
的 ->classId
,这是同一个问题。 $parent->students
是一个 Collection
,而不是一个单一的 Student
2 模型。你需要另一个循环来获得 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
的学生记录。
请注意,whereHas
和 with
包含相同的子查询来约束和急切加载 Students
的每个 Parents
集合到所需的内容。
旁注:您在 Student
上的 classes()
关系有问题。因为它是一个 belongsTo()
方法,所以它应该是 class()
(单数),因为 $student->classes
只会 return 一个单一的 Class
模型。
1 注意命名规范。 Parents
应该是 Parent
;模型名称是单数。
2 您为 Student
模型命名正确,所以要保持一致。