Johan S
Johan S

Reputation: 3591

Slick 3.0.0 - multiple inserts depending on each other with return value

I'm trying to update to Slick 3.0.0 (reactive Slick), however I can't get the most basic stuff to work. Before I could just do something like db.withTransaction { ... } and it would run, however I can't even get this to compile:

def insertNewFacebookUser(
  facebookId: String,
  email: String,
  firstName: String,
  lastName: String
) = {
  val user =
  (Users.map(u ⇒ (u.email, u.firstName, u.lastName)) returning Users) +=
    ((email, firstName, lastName))

  FacebookAuths.map(f ⇒ (f.userId, f.facebookId)) += ((user.id, facebookId))

  user
}

This just complains that user.id is wrapped in some DBIOAction, how should I write this so it compiles?

Thanks

Upvotes: 1

Views: 819

Answers (1)

Klugscheißer
Klugscheißer

Reputation: 1634

Without knowing more about the schema:

def insertNewFacebookUser(
  facebookId: String,
  email: String,
  firstName: String,
  lastName: String
): DBIOAction[???, ???, ???] = for {
      userId <- Users returning Users.map(_.id) += (email, firstName, lastName)
       _     <- FacebookAuths += (userId, facebookId)
    } yield (User(userId, email, firstName, lastName))

val user: Future[User] = db.run(insertNewFaceBookUser(....)

I'm not sure what the exact type of DBIOAction will be returned as it depends on your schema, hence the ???. Everything is wrapped in an action of sorts so when you attempt to use the userId directly in the insert to FacebookAuths, it's the wrong type. Instead what you want to do is map/flatMap on the returned results and compose your fuller action. The for {...} yield is just sugar on map and flatMap. You then run your action to get a Future of your result. You can then map on that as you need to.

Upvotes: 2

Related Questions