2017-03-08 17 views
0

I持って、私は私のコースのためのアル関連付けるテーブルからすべてのデータを持って自分のサーバーコントローラで次の問合せ:のfindAllはsequelizeクエリに複数のテーブルを含める

db.Course.findAll({ 
    include: [ 
     // {model:db.Room, attributes:['id','DisplayLabel']}, 
     // {model:db.Period, attributes:['id','DisplayName']}, 
     {model:db.Subject, attributes:['id','Name']}, 
     // {model:db.Schedule, attributes:['id','Day','StartHour','EndHour']}, 
     {model:db.Person, where : { id : db.Course.PersonId}}, 
    ]} 

コースモデル協会は、このようなものです:

verbose: Executing (default): SELECT `Course`.`id`, `Course`.`Scholarship`, `Course`.`Level`, `Course`.`CourseType`, `Course`.`RecordStatus`, `Course`.`DeletedAt`, `Course`.`createdAt`, `Course`.`updatedAt`, `Course`.`PeriodId`, `Course`.`RoomId`, `Course`.`SubjectId`, `Course`.`SchoolId`, `Course`.`PersonId`, `Course`.`CreatedById`, `Course`.`UpdateById`, `Course`.`DeleteById`, `Subject`.`id` AS `Subject.id`, `Subject`.`Name` AS `Subject.Name`, `People`.`id` AS `People.id`, `People`.`RFC` AS `People.RFC`, `People`.`FirstName` AS `People.FirstName`, `People`.`LastName` AS `People.LastName`, `People`.`LastName2` AS `People.LastName2`, `People`.`Phone` AS `People.Phone`, `People`.`Cellphone` AS `People.Cellphone`, `People`.`Email` AS `People.Email`, `People`.`Birthday` AS `People.Birthday`, `People`.`RecordStatus` AS `People.RecordStatus`, `People`.`DeletedAt` AS `People.DeletedAt`, `People`.`createdAt` AS `People.createdAt`, `People`.`updatedAt` AS `People.updatedAt`, `People`.`RoleId` AS `People.RoleId`, `People`.`SchoolId` AS `People.SchoolId`, `People`.`TutorId` AS `People.TutorId`, `People`.`CreatedById` AS `People.CreatedById`, `People`.`UpdateById` AS `People.UpdateById`, `People`.`DeleteById` AS `People.DeleteById`, `People.Task`.`Title` AS `People.Task.Title`, `People.Task`.`Content` AS `People.Task.Content`, `People.Task`.`Grade` AS `People.Task.Grade`, `People.Task`.`OtherDetails` AS `People.Task.OtherDetails`, `People.Task`.`TaskType` AS `People.Task.TaskType`, `People.Task`.`RecordStatus` AS `People.Task.RecordStatus`, `People.Task`.`DeletedAt` AS `People.Task.DeletedAt`, `People.Task`.`createdAt` AS `People.Task.createdAt`, `People.Task`.`updatedAt` AS `People.Task.updatedAt`, `People.Task`.`KardexId` AS `People.Task.KardexId`, `People.Task`.`PersonId` AS `People.Task.PersonId`, `People.Task`.`CourseId` AS `People.Task.CourseId`, `People.Task`.`CreatedById` AS `People.Task.CreatedById`, `People.Task`.`UpdateById` AS `People.Task.UpdateById`, `People.Task`.`DeleteById` AS `People.Task.DeleteById` FROM `Courses` AS `Course` LEFT OUTER JOIN `Subjects` AS `Subject` ON `Course`.`SubjectId` = `Subject`.`id` INNER JOIN (`Tasks` AS `People.Task` INNER JOIN `People` AS `People` ON `People`.`id` = `People.Task`.`PersonId`) ON `Course`.`id` = `People.Task`.`CourseId` AND `People`.`id` = NULL; 
Course.hasMany(models.Schedule); 

Course.belongsTo(models.Period); 
Course.belongsTo(models.Room); 
Course.belongsTo(models.Subject); 
Course.belongsTo(models.School); 
Course.belongsTo(models.Person); 

問題は、私は「人」のデータはSQLログが加入することを示している人モデルと他のテーブルの関連付けを介してすべての道を行く引き起こし得ることができないということです

あなたはそれがタスクモデルから列をもたらし見ることができるように、これは午前からの起源というテーブルです:nの関係も

associate: function(models){ 
    models.Person.belongsToMany(models.Course, {through : Task}); 
    models.Course.belongsToMany(models.Person, {through : Task}); 
    } 

コースと人の間には、私はちょうど、デバッグのために、データベースからテーブルを削除した場合他のm:n関係と同じことをします。データを取得するためにこれを結合から除外するにはどうすればよいですか?

Model Personは、Student、Teacher、Fatherのすべての異なるユーザーを保存し、このRoleTypesを持つロールモデルの外部キーを保存しているのだろうか?そのため私はCourse ModelにPersonIdキーがあります。このキーはこの場合Teacherであり、TaskモデルではPersonIdは学生ユーザーを指します。あなたはPersonCourseの間に2つの関連付けを定義するため

答えて

1

あなたのクエリがjoinテーブルTaskを使用しています。最初はCourse.belongsTo(Person)、もう1つはm:nの関係です。何が起こるのは、Sequelizeがそれらのうちの1つを考慮に入れていることです.- belongsTo m:nの代わりに?このような状況を省略するためには、それはあなたがalias

db.Course.findAll({ 
    include: [ 
     { model: db.Person, as: 'Teacher' } 
    ] 
}).then((course) => { 
    // course with Teacher 
}); 

を含めなければならないでしょうTeacherあなたが同じことを行うことができますとCourseを取得するために、団体

Course.belongsTo(models.Person, { as: 'Teacher' }); // example alias 

そして中aliasを使用することができますm:nの関係で

models.Course.belongsToMany(models.Person, { as: 'Students', through: Task }); 

Students指定されたコースのすべての生徒を返すためにエイリアス。その後、ModelIdを他のカラム名を取得するために

EDIT

は、あなたが関連してforeignKeyotherKeyを定義する必要があります。メートルで、あなたのケースで:nはCoursePersonとの関係あなたの代わりにStudentIdPersonIdを持つようにしたい、あなたは今すぐ参加するテーブルをotherKey

models.Course.belongsToMany(models.Person, { as: 'Students', through: Task, otherKey: 'StudentId' }); 

を使用する必要があります(CourseIdCourse表を参照)とStudentIdの両方を持っているでしょうPersonテーブル参照)。

注:あなたはまたメートルを定義する場合:Personモデル上のn関係、同等のオプションを追加することを忘れない - foreignKey、次のように:

models.Person.belongsToMany(models.Course, { as: 'Courses', through: Task, foreignKey: 'StudentId' }); 
+0

ありがとう!うまくいきました。あなたが言ったようにn:mの関係にエイリアスを入れようとしました: models.Course.belongsToMany(models.Person、{as: 'Students'、through:tasks}); しかし、それはPersonIdとしてデータベースにアタッチし続けます。 – Ellebkey

+0

答えを編集しましたが、この解決策では 'PersonId'ではなく' StudentId'を取得します。 – piotrbienias

+0

優秀、ありがとう! – Ellebkey

関連する問題