Artem Skliarov
Artem Skliarov

Reputation: 21

How to select by fields in preloaded object?

I wonder if it is possible to select by a condition in a preloaded object. For example, I have tables User and Profile (one to one). So I need to get all Users with Profiles where sex is female.

I thought it can be done by something like this:

Preload("UserProfile").Where("user_profile.sex = ?", "female")

But it returns something like:

pq: missing FROM-clause entry for table \"user_profile\"

Upvotes: 1

Views: 1479

Answers (2)

Prince Khanna
Prince Khanna

Reputation: 21

I also faced the same issue in a recent project. I found the below solution to work for me.

var users []User
Preload("UserProfile","sex = ?","female").Find(&users)

and then check for

user.profile!=nil

The issue in this approach is it will load all users.

But in your case, it can be another way around.

var profiles []Profile
Preload("User").where("sex = ?","female").Find(&profiles)

I hope this will solve your problem.

Upvotes: 0

robbieperry22
robbieperry22

Reputation: 2235

Preloading doesn't join the tables specified. You need to explicitly join the table in question:

Preload("UserProfile").Joins("LEFT JOIN user_profile ON user.id = user_profile.user_id")
    .Where("user_profile.sex = ?", "female")

...Assuming your primary key is called id, and foreign key is called user_id.

Upvotes: 1

Related Questions