diff --git a/README.md b/README.md index 19c5c2f3..9b3b25db 100644 --- a/README.md +++ b/README.md @@ -34,50 +34,61 @@ db.Where("name = ?", "jinzhu").First(&user) db.Where("name = ?", "jinzhu").Find(&users) // Advanced Where Usage -//// select * from users name <> 'jinzhu'; db.Where("name <> ?", "jinzhu").Find(&users) -//// select * from users name = 'jinzhu' and age >= 22; +//// users -> select * from users name <> 'jinzhu'; db.Where("name = ? and age >= ?", "jinzhu", "22").Find(&users) -//// select * from users name in ('jinzhu', 'jinzhu 2'); +//// users -> select * from users name = 'jinzhu' and age >= 22; db.Where("name in (?)", []string["jinzhu", "jinzhu 2"]).Find(&users) +//// users -> select * from users name in ('jinzhu', 'jinzhu 2'); +db.Where("name LIKE ?", "%jin%").Find(&users) +//// users -> select * from users name LIKE "%jinzhu%"; db.Where("birthday < ?", time.Now()).Find(&users) // Inline search condition -//// select * from users where id = 23 limit 1; db.First(&user, 23) -//// select * from users where name = "jinzhu" limit 1; +//// user -> select * from users where id = 23 limit 1; db.First(&user, "name = ?", "jinzhu") -//// select * from users where name = "jinzhu"; +//// user -> select * from users where name = "jinzhu" limit 1; db.Find(&users, "name = ?", "jinzhu") -//// select * from users where name <> "jinzhu" and age > 20; +//// users -> select * from users where name = "jinzhu"; db.Find(&users, "name <> ? and age > ?", "jinzhu", 20) +//// users -> select * from users where name <> "jinzhu" and age > 20; // Select -//// select name from users; db.Select("name").Find(&users) +//// users -> select name from users; // Order -//// select * from users order by age desc, name; db.Order("age desc, name").Find(&users) +//// users -> select * from users order by age desc, name; db.Order("age desc").Order("name").Find(&users) +//// users -> select * from users order by age desc, name; // Limit -//// select * from users limit 3; db.Limit(3).Find(&users) -db.Limit(10).Find(&ten_users).Limit(20).Find(&twenty_users).Limit(-1).Find(&all_users) +//// users -> select * from users limit 3; +db.Limit(10).Find(&users1).Limit(20).Find(&users2).Limit(-1).Find(&users3) +//// users1 -> select * from users limit 10; +//// users2 -> select * from users limit 20; +//// users3 -> select * from users; + // Offset //// select * from users offset 3; db.Offset(3).Find(&users) -db.Offset(10).Find(&users).Offset(20).Find(&users).Offset(-1).Find(&users) +db.Offset(10).Find(&users1).Offset(20).Find(&users2).Offset(-1).Find(&users3) +//// user1 -> select * from users offset 10; +//// user2 -> select * from users offset 20; +//// user3 -> select * from users; // Or -//// select * from users where role = 'admin' or role = 'super_admin'; db.Where("role = ?", "admin").Or("role = ?", "super_admin").Find(&users) +//// users -> select * from users where role = 'admin' or role = 'super_admin'; // Count -//// select count(*) from users where name = 'jinzhu' or name = 'jinzhu 2''; db.Where("name = ?", "jinzhu").Or("name = ?", "jinzhu 2").Find(&users).Count(&count) +//// users -> select * from users where name = 'jinzhu' or name = 'jinzhu 2'; +//// count -> select count(*) from users where name = 'jinzhu' or name = 'jinzhu 2'; db.Model(&User{}).Where("name = ?", "jinzhu").Count(&count) // CreatedAt (auto insert current time on create) @@ -105,13 +116,15 @@ Callbacks is a function defined to a model, if the function return error, will p // Pluck (get users's age as map) var ages []int64 -//// select age from users; -db.Find(&users).Pluck("age", &ages) // ages => []int64{18, 10, 99...} +db.Find(&users).Pluck("age", &ages) +//// ages -> select age from users; var names []string db.Model(&User{}).Pluck("name", &names) +//// names -> select name from users; // Query Chains db.Where("name <> ?", "jinzhu").Where("age >= ? and role <> ?", 20, "admin").Find(&users) +//// users -> select * from users where name <> 'jinzhu' andd age >= 20 and role <> 'admin'; // Create Table with struct db.CreateTable(&User{}) @@ -126,23 +139,23 @@ db.Exec("drop table users;") // Already excited about the basic usage? Let's see some magic! db.First(&first_article).Count(&total_count).Limit(10).Find(&first_page_articles).Offset(10).Find(&second_page_articles) -// first_article -> select * from articles limit 1 -// total_count -> select count(*) from articles -// first_page_articles -> select * from articles limit 10 -// second_page_articles -> select * from articles limit 10 offset 10 +//// first_article -> select * from articles limit 1 +//// total_count -> select count(*) from articles +//// first_page_articles -> select * from articles limit 10 +//// second_page_articles -> select * from articles limit 10 offset 10 db.Where("created_at > ?", "2013/10/10").Find(&cancelled_orders, "state = ?", "cancelled").Find(&shipped_orders, "state = ?", "shipped") -// cancelled_orders -> select * from orders where created_at > '2013/10/10' and state = 'cancelled' -// shipped_orders -> select * from orders where created_at > '2013/10/10' and state = 'shipped' +//// cancelled_orders -> select * from orders where created_at > '2013/10/10' and state = 'cancelled' +//// shipped_orders -> select * from orders where created_at > '2013/10/10' and state = 'shipped' db.Model(&Order{}).Where("amount > ?", 10000).Pluck("user_id", &paid_user_ids) -// paid_user_ids -> select user_id from orders where amount > 10000 +//// paid_user_ids -> select user_id from orders where amount > 10000 db.Where("user_id = ?", paid_user_ids).Find(&:paid_users) -// paid_users -> select * from users where user_id in (10, 20, 99) +//// paid_users -> select * from users where user_id in (10, 20, 99) db.Where("product_name = ?", "fancy_product").Find(&orders).Find(&shopping_cart) -// orders -> select * from orders where product_name = 'fancy_product' -// shopping_cart -> select * from carts where product_name = 'fancy_product' +//// orders -> select * from orders where product_name = 'fancy_product' +//// shopping_cart -> select * from carts where product_name = 'fancy_product' // Do you noticed the search table is different for above query, yay // Open your mind, add more cool examples diff --git a/orm_test.go b/orm_test.go index 30bf01d6..fd987db9 100644 --- a/orm_test.go +++ b/orm_test.go @@ -163,19 +163,31 @@ func TestWhere(t *testing.T) { db.Save(&User{Name: name, Age: 1}) user := &User{} - db.Where("Name = ?", name).First(user) + db.Where("name = ?", name).First(user) if user.Name != name { t.Errorf("Should found out user with name '%v'", name) } user = &User{} - orm := db.Where("Name = ?", "noexisting-user").First(user) + orm := db.Where("name LIKE ?", "%nonono%").First(user) + if orm.Error == nil { + t.Errorf("Should return error when searching for none existing record, %+v", user) + } + + user = &User{} + orm = db.Where("name LIKE ?", "%whe%").First(user) + if orm.Error != nil { + t.Errorf("Should not return error when searching for existing record, %+v", user) + } + + user = &User{} + orm = db.Where("name = ?", "noexisting-user").First(user) if orm.Error == nil { t.Errorf("Should return error when looking for none existing record, %+v", user) } users := []User{} - orm = db.Where("Name = ?", "none-noexisting").Find(&users) + orm = db.Where("name = ?", "none-noexisting").Find(&users) if orm.Error != nil { t.Errorf("Shouldn't return error when looking for none existing records, %+v", users) }