Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

multiple joins with slick

Tags:

For joining between two tables is done like

    (for {     (computer, company) <- Computers leftJoin Companies on (_.companyId === _.id)     if computer.name.toLowerCase like filter.toLowerCase()     } 

But in case if joining required between more tables what is the right way trying below but doesnt work

   (for {     (computer, company,suppliers) <- Computers leftJoin Companies on (_.companyId ===        _.id)      //not right leftjoin Suppliers on (_.suppId === _.id)     if computer.name.toLowerCase like filter.toLowerCase()   } 
like image 991
dsr301 Avatar asked Aug 30 '13 16:08

dsr301


2 Answers

The first join results in a Query returning Tuples. One of the tuple components has the foreign key you want to use for the second join. You need to get this component in the second join condition before getting its field. If Companies is the table, that has the field suppId it would look like this:

(for {   ((computer, company),suppliers) <- Computers leftJoin Companies on (_.companyId === _.id) leftJoin Suppliers on (_._2.suppId === _.id)   if computer.name.toLowerCase like filter.toLowerCase() } yield ... ) 
like image 124
cvogt Avatar answered Oct 20 '22 03:10

cvogt


I think you want this:

for {     (computer, company) <- Computers leftJoin Companies on (_.companyId === _.id)     (supp, _) <- company innerJoin Suppliers on (_.suppId === _.id)     if computer.name.toLowerCase like filter.toLowerCase() } yield (computer, company, supp) 

Of course, I am making assumptions about your model. Not sure if suppliers are linked with companies or computers.

like image 43
pedrofurla Avatar answered Oct 20 '22 04:10

pedrofurla