所以我在父母模型上声明了关系
<?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)
答案 0 :(得分:3)
此行
$parents->students
是您的问题所在。 $parents
是Collection
个模型的Parents
(数组),而不是单个Parents
1 模型。要获得一个classId
,您需要使用循环:
foreach($parents AS $parent){
... // Should be able to access $parent->students without issue;
}
接下来,您尝试访问->classId
中的$parent->students
,这是同样的问题。 $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
班的所有学生家长(从您的<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
的学生记录。
请注意,whereHas
和with
包含相同的子查询,以将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)