diff --git a/README.md b/README.md index b45b6e16..82841d7f 100644 --- a/README.md +++ b/README.md @@ -93,6 +93,16 @@ db.Where(User{Name: "Jinzhu"}).FirstOrInit(&user) db.FirstOrInit(&user, map[string]interface{}{"name": "jinzhu", "age": 20}) //// user -> User{Id: 111, Name: "Jinzhu", Age: 20} +// FirstOrInit With Attrs +db.Where(User{Name: "noexisting_user"}).Attrs(User{Age: 20}).FirstOrInit(&user) +//// user -> select * from users where name = 'noexisting_user'; +//// user -> User{Name: "noexisting_user", Age: 20} +db.Where(User{Name: "Jinzhu"}).Attrs(User{Age: 20}).FirstOrInit(&user) +//// user -> select * from users where name = 'jinzhu'; +//// user -> User{Id: 111, Name: "Jinzhu", Age: 18} +//// Do you notice the difference? The value in Attrs won't be used when search, +//// But is used to initalize the object if no record found + // FirstOrCreate db.FirstOrCreate(&user, User{Name: "noexisting_user"}) //// user -> User{Id: 112, Name: "noexisting_user"} @@ -101,6 +111,15 @@ db.Where(User{Name: "Jinzhu"}).FirstOrCreate(&user) db.FirstOrCreate(&user, map[string]interface{}{"name": "jinzhu", "age": 20}) //// user -> User{Id: 111, Name: "Jinzhu", Age: 20} +// FirstOrCreate With Attrs +db.Where(User{Name: "noexisting_user"}).Attrs(User{Age: 20}).FirstOrCreate(&user) +//// user -> select * from users where name = 'noexisting_user'; +//// user -> User{Id: 112, Name: "noexisting_user", Age: 20} +db.Where(User{Name: "Jinzhu"}).Attrs(User{Age: 20}).FirstOrCreate(&user) +//// user -> select * from users where name = 'jinzhu'; +//// user -> User{Id: 111, Name: "Jinzhu", Age: 18} +//// You must noticed that the Attrs is similar to FirstOrInit with Attrs, yes? + // Select db.Select("name").Find(&users) //// users -> select name from users; @@ -264,6 +283,10 @@ db.Where("mail_type = ?", "TEXT").Find(&users1).Table("deleted_users").First(&us //// users1 -> select * from users where mail_type = 'TEXT'; //// users2 -> select * from deleted_users where mail_type = 'TEXT'; +db.Where("email = ?", "x@example.org"').Attrs(User{FromIp: "111.111.111.111"}).FirstOrCreate(&user) +//// user -> select * from users where email = 'x@example.org' +//// (if no record found) -> INSERT INTO "users" (email,from_ip) VALUES ("x@example.org", "111.111.111.111") + // Open your mind, add more cool examples ``` diff --git a/do.go b/do.go index 73e2801f..d78880f9 100644 --- a/do.go +++ b/do.go @@ -108,6 +108,7 @@ func (s *Do) prepareCreateSql() { strings.Join(sqls, ","), s.model.returningStr(), ) + debug(s.sql) return }