BadMethodCallException Вызов неопределенного метода в методе модели, который ссылается на себя, используя отношения многие ко многим - PullRequest
1 голос
/ 10 февраля 2020

Я строю систему, в которой у пользователя может быть много учителей (модель того же пользователя), а у учителей может быть много пользователей. Когда я нажимаю на контроллер, я получаю:

BadMethodCallException с сообщением «Вызов неопределенного метода App / User :: teacher ()

Код

Контроллер

public function requestTeacher()
{
    $teacher = User::where(['hashed_id' => 'auserhash123', 'is_teacher' => 1])->first();

    $user = auth()->user()->first();

    $teacher->notify(new teacherRequest($user));

    $user->teachers()->attach($teacher->id);
}

Модель пользователя

public function teachers()
{
    return $this->belongsToMany('App\User','teacher_approval','user_id','teacher_id');
}

public function clients()
{
    return $this->belongsToMany('App\User','teacher_approval','teacher_id','user_id');
}

Таблица подтверждения_ учителя

Schema::create('teacher_approval', function (Blueprint $table) {
    $table->unsignedInteger('user_id');
    $table->unsignedInteger('teacher_id');
    $table->unsignedInteger('status')->default(0);
    $table->timestamp('decission_date')->nullable();

    $table->foreign('user_id')->references('id')->on('users')
        ->onDelete('cascade');
    $table->foreign('teacher_id')->references('id')->on('users')
        ->onDelete('cascade');
});

Редактировать:

Интересно, это потому, что пользователь расширяет SparkUser (я использую laravel Spark) class User extends SparkUser { }

1 Ответ

0 голосов
/ 10 февраля 2020

Измените ваши отношения, как

$table->foreign('teacher_id')->references('id')->on('users') ->onDelete('cascade');

Модель пользователя

public function teachers()
{
    return $this->belongsToMany('App\Teacher','teacher_approval','user_id','teacher_id');
}

Модель учителя

public function userses() //users like
{
    return $this->belongsToMany('App\User','teacher_approval','teacher_id','user_id');
}
...