2013-03-12 3 views
6

У меня есть таблица вроде этого:Как определить дополнительный внешний ключ в 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. 
... 
} 

где мой случай класс:

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

Как вы заметили, геолокация дополнительный внешний ключ ....

я не могу найти любой способ описать это «Необязательно» в моем определении внешнего ключа.

Я попытался, как:

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

, но я получаю:

Вызванный: scala.slick.SlickException: Не удается использовать колонки Применить Функция Cast в ограничении внешнего ключа (только по имени колонны разрешено)

Есть ли у кого-нибудь предложение?

ответ

3

Я не думаю, что то, что вы пытаетесь сделать, доступно с помощью внешних ключей. Выезд joining и user defined types из документов Slick.

Обратите внимание на пример с leftJoin:

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

Так что если вы хотите, чтобы запросить все ваши Addresses, вы хотели бы начать с чем-то вроде

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

Вы можете затем отобразить результаты этого запроса, чтобы вы вернули фактический экземпляр Address, в комплекте с Option[GeoLocation]. Вот почему я связал «определяемые пользователем типы» в документах ... это новая функция для меня (я был знаком с ScalaQuery, который был предыдущим воплощением Слика), но выглядит довольно многообещающим.

10

Попробуйте следующее:

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

geoLocationId теперь колонна Option[Int] поэтому O.Nullable больше не нужны (_.id.?) возвращает GeoLocation в качестве опции, или None, если он был нулевым.

+0

Ах, он работает. Благодарю. – liutao

Смежные вопросы