我试图用ent.建立一个动态查询,因为搜索字段可能会有所不同。3表和SQL查询的关系如下。结果应该包含Customer表和Order表的字段。
- 客户表 *
| 名字|姓氏(_N)|帐户ID| account_id |
|:----------:|- -|- -| ----------:|
- 账户表 *
| 卡片编号|支付ID| payment_id |
|:--------:|- -| ----------:|
- 订购表格 *
| 产品编号|支付ID| payment_id |
|:-----------:|- -| ----------:|
Select customer_Id , first_name, last_name, order_num, product_num
FROM customer c
INNER JOIN account a ON c.account_id = a.account_id
INNER JOIN order o ON a.payment_id = o.payment_id
WHERE c.customer_id = 123 OR c.first_name = ‘Mike’ OR c.last_name = ‘Lee’ OR c.account_id = ‘321’
字符串
由于搜索字段会有所不同,用户可以提供customer_Id,first_name,last_name,account_id中的任何一个数据。所以我使用ent. Predicate来创建一个动态查询。
var predicateCustomer []predicate.Customer
If searchFields.CustomerId != “” {
predicateCustomer = append(predicateCustomer, customer.CustomerIdEQ(searchFields.CustomerId))
}
If searchFields.FirstName != “” {
predicateCustomer = append(predicateCustomer, customer.FirstNameEQ(searchFields.FirstName))
}
If searchFields.LastName != “” {
predicateCustomer = append(predicateCustomer, customer.LastNameEQ(searchFields.LastName))
}
If searchFields.AccountId != “” {
predicateCustomer = append(predicateCustomer, customer.AccountIdEQ(searchFields.AccountId))
}
// Approach 1
item, err := e.client.Customer.Query().
Where(predicateCustomer...)
Limit(30).
Offset(0).
All(ctx)
// Approach 2
item, err := e.client.Customer.Query().
Where(predicateCustomer...).QueryAccount().QueryOrder().
Limit(30).
Offset(0).
All(ctx)
型
我目前的问题是,第一种方法只返回Customer表中的字段,第二种方法只返回Order表中的字段。如果我想同时拥有Customer和Order表中的字段,那么查询应该是什么?
1条答案
按热度按时间hm2xizp91#
你可以通过使用类似于你在当前代码中提供的sql查询的连接来实现想要的输出。这里是更新的代码,给予一个尝试;
字符串
您可以使用WithAccount()和WithOrder()函数在查询中包括关联的Account和Order实体。item变量将保存查询的组合结果,这些结果从Customer和Order表中检索字段。
验证ent模式中的边是否已定义为容纳Customer、Account和Order表之间的这些连接。
希望能成功:)