Свойство [студентов] не существует в этом экземпляре коллекции - PullRequest
0 голосов
/ 29 августа 2018

Итак, у меня есть отношения, объявленные на родителях Модель как

 <?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 голосов
/ 29 августа 2018

Эта строка

$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 любых записей о студентах, которые имеют класс с идентификатором $class.

Обратите внимание, что whereHas и with содержат один и тот же подзапрос для ограничения и активной загрузки каждого Parents набора Students в соответствии с требованиями.

Sidenote: Ваши classes() отношения на Student имеют проблему. Поскольку это метод belongsTo(), он должен быть class() (в единственном числе), так как $student->classes будет возвращать только одну Class модель.

<Ч />

1 Обратите внимание на соглашения об именах. Parents должно быть Parent; Названия моделей единичны.
2 Вы назвали Student Модель правой, так что будьте последовательны.

0 голосов
/ 29 августа 2018

Попробуйте этот запрос:

$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)

...