2017-01-09 4 views
1

Ich habe 3 Tabellen, um meine viele zu viele Beziehung darzustellen. Kunden, Unternehmen, Firmenkunden.Gebäude go-pg ORM Abfrage für viele zu viele Beziehung

companies: 
- id 
- name 

customers: 
- id 
- username 

companies_customers: 
- id 
- customer_id 
- company_id 

Nun ist die Abfrage, die ich ausführen möchten ist es, alle Kunden mit einem company_id von 1. Eine rohe SQL-Abfrage auswählen könnte/etwas könnte wie folgt aussehen:

SELECT * FROM customers c INNER JOIN customers_companies cc ON c.id = cc.customer_id WHERE cc.company_id = 1 

Ich habe versucht, zu tun so etwas wie dies in go-pg:

var customers []*Customer 

s.DB.Model(&customers).Relation("Companies", func(q *orm.Query) (*orm.Query, error) { 
    return q.Where("company_id = ?", companyID), nil 
}).Select() 

Antwort

1

in diesem speziellen Fall, Sie können etwas Abhilfe tun, um diese spezifische Abfrage ausführen, ich nehme an, Sie haben Thesen Strukturen:

type Company struct { 
    TableName struct{} `sql:"companies"` 
    ID  int64 
    Name  string 
    Customers []*Customer `pg:",many2many:companies_customers"` 
} 

type Customer struct { 
    TableName struct{} `sql:"customers"` 
    ID  int64 
    Username string 
    Companies []*Company `pg:",many2many:companies_customers"` 
} 

Wenn Sie nur die Abfrage mit der JOIN ausführen müssen, können Sie

var customers []*Customer 
err := conn.Model(&customers).Column("customer.*").Join("inner join companies_customers cc on customer.id = cc.customer_id").Where("cc.company_id = ?", companyID).Select() 
if err != nil { 
    // Error Handler 
} else { 
    for _, customer := range customers { 
     fmt.Printf("Customer -> id: %d, username:%s \n", customer.ID, customer.Username) 
    } 
} 

Diese erzeugen:

SELECT "customer".* FROM customers AS "customer" inner join companies_customers cc on customer.id = cc.customer_id WHERE (cc.company_id = 1) 

Aber Sie können auch wie folgt vorgehen:

Dieser Code führt zwei Abfragen aus:.
SELECT "company"."id", "company"."name" FROM companies AS "company" WHERE (company.id = 1) 
SELECT companies_customers.*, "customer".* FROM customers AS "customer" JOIN companies_customers ON (companies_customers."company_id") IN ((1)) WHERE ("customer"."id" = companies_customers."customer_id") 

zuerst eine Abfrage erstellen, die Daten aus company, danach zu holen, holt alle Kunden für das Unternehmen.

+0

Welches der beiden wäre effizienter? – Rodrigo

+0

@Rodrigo Wenn Sie nach Effizienz suchen, ist die erste Option besser, weil Sie nur eine Abfrage ausführen, aber Sie müssen die Verknüpfung selbst schreiben. – Motakjuq