GORM
レコードを 1 件だけ取得する時、
GORM は First(), Take(), Last() という 3 つの関数を用意している。
それぞれどういう SQL が発行されるかというと下記になる。
// Get the first record ordered by primary key
db.First(&user)
// SELECT * FROM users ORDER BY id LIMIT 1;
// Get one record, no specified order
db.Take(&user)
// SELECT * FROM users LIMIT 1;
// Get last record, order by primary key desc
db.Last(&user)
// SELECT * FROM users ORDER BY id DESC LIMIT 1;
気をつけるべきは ORDER BY の部分。
First() と Last() は id でソートしている。
つまり、他のカラムを基準にソートしたい場合は、Take() を使ったほうが良いと思って記事にすることにした。
例えば下記のようにしても挙動的には、同じように取得できる。
db.Order("updated_at").First(&user)
db.Order("updated_at").Take(&user)
db.Order("updated_at").Last(&user)
挙動は同じだけど上記のようなソースコードが混在し始めると可読性が非常に悪くなる。
id でソートする場合は First(), Last() とし、
id 以外のカラムを基準にする時は Take() を使ったほうが、
未来の自分、他の人に対して優しいソースコードになるのではないかと思う。