Laravel: 如何获取分配给特定代理的客户的所有订单
Laravel: How to Get All Orders of Customers Assigned to a Specific Agent
几天来我一直在绞尽脑汁想写这个查询,但就是一无所获。我有这些表:
Agents (Users)
id
name
email
password
created_at
updated_at
Customers
id
agent_id
firstname
lastname
email
created_at
updated_at
Orders
id
customer_id
product_id
amount
Customer_Tags
id
customer_id
name
Products
id
name
我需要编写一个 SQL 语句来获取分配给当前登录用户(由 agent_id)并具有此标签(ID:234)但没有的所有客户订单这些标签中的任何一个 [3343、445、333] 并且购买了这些产品中的任何一个(ID:18、33、29)。
只是为了让您了解标签的作用。客户根据他们采取的行动进行标记。这样做是为了营销目的。如果客户购买产品,该客户会获得一个特定的标签。如果他们继续采取其他行动,例如观看网络研讨会,则会附加另一个标签。
该应用程序基于 Laravel 框架构建。我尝试使用内置的 Eloquent ORM。
return Order::with('customer')
->whereHas('customer', function (Builder $query) {
$query->where('agent_id', Auth::id());
})
->whereHas('customer.tags', function (Builder $query) {
$query->whereIn('id', [234])
->whereNotIn('id', [3343, 445, 333]);
})
->whereHas('product', function (Builder $query) {
$query->whereIn('id', [18, 33, 29]);
})
->get();
它通过拉取标签 ID 为 234 的所有客户的订单来工作。但是,它还包括具有这些标签(3343、445、333)中任何一个的客户的订单,这与我的相反想。
我也尝试使用内置的查询生成器并得到了相同的结果。
return DB::table('orders')
->join('customers', 'orders.custom_id', '=', 'customers.id')
->join('customer_tags', function ($join) {
$join->on('customers.id', '=', 'customer_tags.customer_id')
->whereIn('customer_tags.id', [234])
->whereNotIn('customer_tags.id', [3343, 445, 333]);
})
->join('products', 'products.id', '=', 'orders.product_id')
->whereIn('orders.product_id', [18, 33, 29])
->where('customers.agent_id', Auth::id())
->select('orders.invoice_at', 'customers.*', 'products.name')
->get();
请帮忙。现在,我对任何事情都持开放态度。 Eloquent ORM、查询生成器或只是一个清晰的 SQL 语句。
您不能只将 tags
子句添加到 customer
查询中并使用 whereDoesntHave 吗?
Order::with('customer')
->whereHas('customer', function ($query) {
$query
->where('agent_id', Auth::id())
->whereHas('tags', function ($query) {
$query->whereIn('id', [234]);
})
->whereDoesntHave('tags', function ($query) {
$query->whereIn('id', [3343, 445, 333]);
});
})
->whereHas('product', function ($query) {
$query->whereIn('id', [18, 33, 29]);
});
此外,您可以使用 ->toSql()
查看最终的 SQL 查询,看看它是否是您需要的。
几天来我一直在绞尽脑汁想写这个查询,但就是一无所获。我有这些表:
Agents (Users)
id
name
email
password
created_at
updated_at
Customers
id
agent_id
firstname
lastname
email
created_at
updated_at
Orders
id
customer_id
product_id
amount
Customer_Tags
id
customer_id
name
Products
id
name
我需要编写一个 SQL 语句来获取分配给当前登录用户(由 agent_id)并具有此标签(ID:234)但没有的所有客户订单这些标签中的任何一个 [3343、445、333] 并且购买了这些产品中的任何一个(ID:18、33、29)。
只是为了让您了解标签的作用。客户根据他们采取的行动进行标记。这样做是为了营销目的。如果客户购买产品,该客户会获得一个特定的标签。如果他们继续采取其他行动,例如观看网络研讨会,则会附加另一个标签。
该应用程序基于 Laravel 框架构建。我尝试使用内置的 Eloquent ORM。
return Order::with('customer')
->whereHas('customer', function (Builder $query) {
$query->where('agent_id', Auth::id());
})
->whereHas('customer.tags', function (Builder $query) {
$query->whereIn('id', [234])
->whereNotIn('id', [3343, 445, 333]);
})
->whereHas('product', function (Builder $query) {
$query->whereIn('id', [18, 33, 29]);
})
->get();
它通过拉取标签 ID 为 234 的所有客户的订单来工作。但是,它还包括具有这些标签(3343、445、333)中任何一个的客户的订单,这与我的相反想。
我也尝试使用内置的查询生成器并得到了相同的结果。
return DB::table('orders')
->join('customers', 'orders.custom_id', '=', 'customers.id')
->join('customer_tags', function ($join) {
$join->on('customers.id', '=', 'customer_tags.customer_id')
->whereIn('customer_tags.id', [234])
->whereNotIn('customer_tags.id', [3343, 445, 333]);
})
->join('products', 'products.id', '=', 'orders.product_id')
->whereIn('orders.product_id', [18, 33, 29])
->where('customers.agent_id', Auth::id())
->select('orders.invoice_at', 'customers.*', 'products.name')
->get();
请帮忙。现在,我对任何事情都持开放态度。 Eloquent ORM、查询生成器或只是一个清晰的 SQL 语句。
您不能只将 tags
子句添加到 customer
查询中并使用 whereDoesntHave 吗?
Order::with('customer')
->whereHas('customer', function ($query) {
$query
->where('agent_id', Auth::id())
->whereHas('tags', function ($query) {
$query->whereIn('id', [234]);
})
->whereDoesntHave('tags', function ($query) {
$query->whereIn('id', [3343, 445, 333]);
});
})
->whereHas('product', function ($query) {
$query->whereIn('id', [18, 33, 29]);
});
此外,您可以使用 ->toSql()
查看最终的 SQL 查询,看看它是否是您需要的。