8

次のようなテーブルがあります。

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])

お気づきのように、 geoLocation はオプションの外部キーです....

外部キー定義でこの「オプション」を記述する方法が見つかりません。

私は次のように試しました:

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

しかし、私は受け取ります:

原因: scala.slick.SlickException: 外部キー制約で列 Apply Function Cast を使用できません (名前付き列のみが許可されます)

誰か提案がありますか?

4

2 に答える 2

19

以下を試してください:

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.?)返すか、null の場合は を返します。GeoLocationNone

于 2013-09-24T13:03:55.343 に答える
3

あなたがやろうとしていることは、外部キーを使って達成できるとは思いません。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]。そのため、ドキュメントで「ユーザー定義型」をリンクしました...これは私にとって新しい機能です(Slickの以前の化身であるScalaQueryに精通していました)が、かなり有望に見えます。

于 2013-03-12T21:57:22.530 に答える