はい!今やってます!

Work Pertly, Live Idly

GormのPreload時のstatusチェックの挙動

GormのSQLでPreloadを利用する場合、各モデルと紐付けるタイミングで条件を指定したくなる場合がある。 Preloadに条件指定する場合に、上手く実行されるケースとされないケースがある。

こちらは正しくすべてのテーブルでstatusが指定される。

func (questionRepository *questionRepository) FindQuestions(tx *gorm.DB, questions *[]model.Question) (err error) {
    if result := tx.
        Where("status = ?", status.Valid).
        Preload("User", "status = ?", status.Valid).
        Preload("User.Contact", "status = ?", status.Valid).
        Find(&questions); result.Error != nil && !result.RecordNotFound() {
        return result.Error
    }
    return nil
}

しかし、こちらだとquesionsテーブルではステータスが正しく指定されるが、それ以外のテーブルでstatusが正しく指定されない場合がある。

func (questionRepository *questionRepository) FindQuestions(tx *gorm.DB, questions *[]model.Question) (err error) {
    if result := tx.
        Where("status = ?", status.Valid).
        Preload("User.Contact", "status = ?", status.Valid).
        Preload("User", "status = ?", status.Valid).
        Find(&questions); result.Error != nil && !result.RecordNotFound() {
        return result.Error
    }
    return nil
}

Preloadの順番に気をつけて