pg icon indicating copy to clipboard operation
pg copied to clipboard

Has one query not forming correctly

Open atishpatel opened this issue 4 years ago • 0 comments

I'm having trouble getting a has one relationship to work. I followed the wiki's examples and have been trying this for hours.

I know the table names and fields are really weird with plural and underscores, but I've inherited this database and can't change it currently.

type Subscription struct {
	tableName struct{} `pg:"\"Subscriptions\",discard_unknown_columns"`

	ID        string    `pg:"_id,pk,type:uuid"`
	Status    string    `pg:"status"`
...
	AddressID string    `pg:"address__id"`

	Address *Address `pg:"fk:address__id" json:"Address"`

}

type Address struct {
	tableName struct{} `pg:"\"Addresses\",discard_unknown_columns"`

	ID        string    `pg:"_id,pk,type:uuid"`
	Line1     string    `pg:"line1,notnull"`
	Line2     *string   `pg:"line2"`
	City      string    `pg:"city,notnull"`
	State     string    `pg:"state,notnull"`
	ZipCode   string    `pg:"zipCode,notnull"`
	Longitude float64   `pg:"longitude"`
	Latitude  float64   `pg:"latitude"`
	CreatedAt time.Time `pg:"created_at,notnull"`
	UpdatedAt time.Time `pg:"updated_at,notnull"`
}

func (c *Client) Get(id string) (*Subscription, error) {
	sub := &Subscription{}
	q := c.db.Model(sub)
         // q = q.Relation("Addresses") This doesn't work for some reason. Gives relationship not found error. But Address does use Addresses in the query.
	q = q.Relation("Address")
	err := q.Where(`"subscription"."_id" = ?`, id).Select()
	if err != nil {
		return nil, err
	}
	return sub, nil
}

This results in

SELECT "subscription"."_id", "subscription"."status", "subscription"."created_at", "subscription"."updated_at", "subscription"."user__id", "subscription"."address__id", "subscription"."deleted_at", "address"."_id" AS "address___id", "address"."line1" AS "address__line1", "address"."line2" AS "address__line2", "address"."city" AS "address__city", "address"."state" AS "address__state", "address"."zipCode" AS "address__zipCode", "address"."longitude" AS "address__longitude", "address"."latitude" AS "address__latitude", "address"."created_at" AS "address__created_at", "address"."updated_at" AS "address__updated_at" FROM "Subscriptions" AS "subscription" LEFT JOIN "Addresses" AS "address" ON "address"."_id" = "subscription"."_id" WHERE ("subscription"."_id" = '01bc61cb-60f9-41f3-96bf-dd92589efe14')
{
  "ID": "01bc61cb-60f9-41f3-96bf-dd92589efe14",
  "Status": "active",
  "AddressID": "",
  "Address": {
    "ID": "",
    "Line1": "",
    "Line2": null,
    "City": "",
    "State": "",
    "ZipCode": "",
    "Longitude": 0,
    "Latitude": 0,
    "CreatedAt": "0001-01-01T00:00:00Z",
    "UpdatedAt": "0001-01-01T00:00:00Z"
  }
}
AddressID is empty even though it isn't in the database

The resulting query is incorrect. I get LEFT JOIN "Addresses" AS "address" ON "address"."_id" = "subscription"."_id But i would expect LEFT JOIN "Addresses" AS "address" ON "address"."_id" = "subscription"."address__id. Could you explain what i have setup incorrectly if it's incorrect?

atishpatel avatar Mar 29 '20 20:03 atishpatel