2013-03-12 13 views
6

Mam tabeli tak:Jak zdefiniować opcjonalny klucz obcy w Slick?

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. 
... 
} 

gdzie moja klasa przypadek jest:

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

Jak można zauważyć, geolokalizacja jest opcjonalny klucz obcy ....

nie mogę znaleźć sposób na opisanie tego "Opcjonalnego" w mojej definicji klucza obcego.

Próbowałem tak:

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

ale otrzymują:

Spowodowany przez: scala.slick.SlickException: Nie można użyć kolumny Zastosuj funkcji Cast in klucz obcy (tylko w nazwie kolumny są dozwolone )

Czy ktoś ma sugestię?

Odpowiedz

3

Nie sądzę, że to, co próbujesz zrobić, można osiągnąć za pomocą kluczy obcych. Wyewidencjonuj joining i user defined types ze śliskiej dokumentacji.

Uwaga przykład z leftJoin:

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

Więc jeśli chcesz zapytać o wszystkie swoje Addresses, że chcesz zacząć coś jak

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

Można wtedy map wyniki tego zapytania, aby odzyskać rzeczywistą instancję Address wraz z Option[GeoLocation]. Właśnie dlatego powiązałem "typy zdefiniowane przez użytkownika" w dokumentach ... to jest dla mnie nowa funkcja (znałem ScalaQuery, które było wcześniejszym wcieleniem Slicka), ale wygląda na dość obiecującą.

10

spróbuj wykonać następujące czynności:

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

geoLocationId jest teraz Kolumna Option[Int] dlatego O.Nullable nie jest już potrzebne (_.id.?) Zwraca GeoLocation jako opcja lub None gdyby była zerowa.

+0

Ah, Działa. Dzięki. – liutao