2014-02-04 4 views
5

У меня есть три таблицы: Schools (id, school_name), Schools_Focuses (id, school_id, focus_id) и Focuses (id, focus) и хотят создать метод в моей модели Schools который возвращает все связанные фокусы.Создание отношений «многие ко многим»

я могу выполнить то, что я хочу сделать с этим SQL-запрос:

SELECT focus FROM focuses INNER JOIN schools_focuses ON focuses.id = schools_focuses.focus_id INNER JOIN schools ON schools.id = schools_focuses.school_id WHERE schools.id = 36; 

код модели:

// Define Models 
exports.School = School = Bookshelf.PG.Model.extend({ 
    tableName: 'schools', 

    focuses: function() { 
    return this.hasMany(Focus).through(Schools_Focuses); 
    } 
}); 

Ошибка:

Possibly unhandled Error: column focuses.schools_focuse_id does not exist, sql: select "focuses".*, "schools_focuses"."id" as "_pivot_id", "schools_focuses"."school_id" as "_pivot_school_id" from "focuses" inner join "schools_focuses" on "schools_focuses"."id" = "focuses"."schools_focuse_id" where "schools_focuses"."school_id" in (?)

Я не хочу иметь этот дополнительный столбец (focuses.schools_focuse_id) в Focuses, потому что фокус может принадлежать более чем одной школе.

Как я могу правильно настроить это? Я играл с внешними ключами и другими клавишами для hasMany() и через(), но не повезло.

Спасибо!

ответ

7

Похоже, что вам нужно использовать belongsToMany() вместо hasMany().

// Define Models 
exports.School = School = Bookshelf.PG.Model.extend({ 
    tableName: 'schools', 

    focuses: function() { 
    return this.belongsToMany(Focus, 'schools_focuses'); 
    } 
}); 

Второй параметр необходим, поскольку таблица соединений не находится в альфа-порядке («focuses_schools»). И если у него проблемы с идентификацией ключей join (school_id, focus_id), вы можете переопределить их как параметры. Кроме того, поскольку он использует внутреннюю таблицу соединений, вам не нужно создавать отдельную модель для Schools_Focuses.

0

Если нам не нужно создавать отдельную модель для Schools_Focuses, то как мы запрашиваем данные из распределительной таблицы, а именно:

'SELECT * FROM focuses_schools WHERE focus_id = 2 & school_id = 1' 
+0

Если у вас есть еще один вопрос, пожалуйста, спросите его, нажав кнопку [Задать Вопрос] (// stackoverflow.com/questions/ask). – ekhumoro

 Смежные вопросы

  • Нет связанных вопросов^_^