Laravel HasMany WhereNotIn Query - PullRequest
       64

Laravel HasMany WhereNotIn Query

0 голосов
/ 15 января 2020

Проблема: Я пытаюсь запросить PeopleType, чтобы найти все курсы, с которыми человек не связан.

У меня 4 таблицы

  1. People
  2. PeopleTypes
  3. Курсы
  4. People_Courses
  5. PeopleType_Courses

У меня следующие отношения

МОДЕЛЬ ЧЕЛОВЕКА

public function getPeopleType() {
  return $this->belongsTo('App\PeopleType','type_id');
}

public function getCourses() {
  return $this->belpngsToMany('App\Course','People_Courses','person_id','course_id');
}

МОДЕЛЬ PEOPLE_TYPE

public function getPeople() {
  return $this->hasMany('App\Person','type_id');
}

public function getCourses() {
  return $this->belpngsToMany('App\Course','PeopleType_Courses','people_type_id','course_id');
}

Моя попытка:

$peopleType = \App\PeopleType::FindOrFail(1);
$courses = $peopleType->getCourses()->whereNotIn('id', function($q) use($person) {
                $q->select('course_id')
                  ->from('People_Courses')
                    ->where('person_id', $person->id);
           })->get();

Мой ответ:

Нарушение ограничения целостности: 1052 Идентификатор столбца в IN / ALL / ANY подзапросе неоднозначен

People Cours Table Schemati c

Schema::create('People_Courses', function (Blueprint $table) {
   $table->increments('id');
   $table->integer('course_id');
   $table->integer('person_id');
);

PeopleType_Courses Table Schemati c

Schema::create('PeopleType_Courses', function (Blueprint $table) {
   $table->increments('id');
   $table->integer('course_id');
   $table->integer('people_type_id');
);

1 Ответ

1 голос
/ 15 января 2020

Когда вы работаете с отношениями, для которых в запросе выбрано аналогичное имя столбца, вам необходимо устранить неоднозначность, указав имя таблицы в столбце. например:

$peopleType->getCourses()->whereNotIn('courses.id', function($q)...  //courses.id
...