2013-03-12 37 views
6

Böyle bir tablo var:Seçmeli yabancı anahtar Slick'te nasıl tanımlanır?

object Addresses extends Table[AddressRow]("address") { 
    def id = column[Int]("id", O.PrimaryKey, O.AutoInc) 
    def street = column[String]("street") 
    def number = column[String]("number") 
    def zipcode = column[String]("zipcode") 
    def city = column[String]("city") 
    def country = column[String]("country") 
    def geoLocationId = column[Int]("geo_location_id", O.Nullable) 

// Foreign keys. 
def geoLocation = foreignKey("fk_geo_location", geoLocationId, GeoLocations)(_.id) 

// Rest of my code. 
... 
} 

dosyamın sınıftır burada:

case class AddressRow(
    id: Option[Int] = None, 
    street: String, 
    number: String, 
    zipcode: String, 
    city: String, 
    country: String, 
    geoLocationId: Option[Int]) 

Eğer Coğrafi Konum isteğe bağlı yabancı anahtarı olduğunu fark gibi ....

Yapamam Yabancı anahtar tanımımda bu "İsteğe Bağlı" tanımlamak için herhangi bir yol bulmak.

ben gibi denedim:

def geoLocation = foreignKey("fk_geo_location", geoLocationId.asColumnOf[Option[Int]], GeoLocations)(_.id) 

ama alırsınız:

Neden Olduğu: scala.slick.SlickException: Sütun (yabancı anahtar kısıtlaması yalnızca adlandırılmış Fonksiyon Cast uygula kullanılamaz sütunlar iznindir)

Herhangi bir öneri var mı?

cevap

3

Yapmaya çalıştığınız şeyin, yabancı anahtarlar kullanılarak gerçekleştirilebilir olduğunu düşünmüyorum. Slick belgelerinden joining ve user defined types'a bakın.

Not leftJoin ile örnek: Eğer Addresses tüm sorgulamak istiyorsa Yani

val explicitLeftOuterJoin = for { 
    (c, s) <- Coffees leftJoin Suppliers on (_.supID === _.id) 
} yield (c.name, s.name.?) 

, sen

val addressGeolocQuery = for { 
    (addr, loc) <- Addresses leftJoin GeoLocations on (_.geoLocationId === _.id) 
} yield addr.id ~ loc.prop1.? ~ loc.prop2.? /*and so on*/ 

gibi bir başlangıç ​​isterdim Ardından eşleştirebilirsiniz Option[GeoLocation] ile tamamlanmış bir gerçek Address örneğini geri almak için bu sorgu sonuçları. Bu yüzden "kullanıcı tanımlı türler" in dokümanlardaki bağlantılarını yaptım ... bu benim için yeni bir özellik (Slick'in önceki enkarnasyonu olan ScalaQuery'yi tanıdım), ama oldukça umut verici görünüyor.

10

aşağıdaki deneyin: Bu boş durumunda

def geoLocationId = column[Option[Int]]("geo_location_id") 
//Foreign Key 
def geoLocation = foreignKey("fk_geo_location", geoLocationId, GeoLocations)(_.id.?) 

geoLocationId şimdi Option[Int] nedenle O.Nullable artık tabi (_.id.?) getiriler bir seçenek olarak GeoLocation veya None bir sütun olduğunu.

+0

Ah, Çalışır. Teşekkürler. – liutao