どうしてもdbrを使わないといけない場面に出くわしたので、忘れそうなものを記録する
SELECTの情報が少なすぎる。
どうやって、SQLビルダーから、文字列を追い出すか、それが問題だ・・・
①godocから探る
https://godoc.org/github.com/gocraft/dbr
①テストから、探る
https://github.com/gocraft/dbr/blob/master/select_test.go
※例なのでテーブル名、カラム名に変数は使わず記述している
#Joinしたテーブルに別名をつける
LeftJoin(dbr.I("users").As("staffs"), "staff.id=companies.user_id").
#サブクエリにエイリアスをつける。サブクエリをJoinする
subQuery := Select("company_id").
From("users").
Where("id = ?", userId).
As("staffs")
_, err := Select("*")
From("companies").
LeftJoin(subQuery, "staffs.company_id=companies.id").
Load(&results)
構造体にではなく、単一のカラムをプリミティブな型のスライスに取得
一時変数を、いちいち構造体定義するのは面倒。また構造体をスライスに変換する手間もコードが汚れる
取得したらIN句などで利用する
var myCompanyUserIds []int64
_, err := Select("users.id").
From("users").
Where("users.company_id = ?", myCompanyID).
Load(&myCompanyUserIds)
#プレースホルダを使わず Whereを記述する
Where(dbr.Eq("company.id", myCompanyID))
複合条件的なWhereを記述する
Where(
dbr.Or(
dbr.Eq("company.id", myCompanyID1),
dbr.Eq("company.id", myCompanyID2),
),
)
// OrはAnd, EqはNeq、Like、、NotLike,Lt,Lte,Gt,Gte,Exprなどに差し替え可能
#生のSQL式を途中に挟む
// プレースホルダも使える
dbr.Expr("REPLACE(CONCAT(`user`.`last_name`, `user`.`first_name`),' ','') like ?", term),