【问题标题】:Laravel: How to Get All Orders of Customers Assigned to a Specific AgentLaravel:如何获取分配给特定代理的所有客户订单
【发布时间】:2019-12-11 20:22:32
【问题描述】:

几天来,我一直在努力写这个查询,但是却一无所获。我有这些表:

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、Query Builder 还是一个清晰的 SQL 语句。

【问题讨论】:

    标签: php mysql laravel eloquent eloquent-relationship


    【解决方案1】:

    您不能将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 查询,看看它是否是您需要的。

    【讨论】:

    • 你是个天才。你只是解决了我这几天一直在殴打自己的问题。我什至在 Laracast 论坛上发布了它,没有人可以提供帮助。朋友,谢谢。如何也包括没有标签的客户?
    • @lotsonj 没问题。您只需在客户查询中添加orDoesntHave('tags')
    猜你喜欢
    • 2023-03-05
    • 1970-01-01
    • 2019-02-22
    • 1970-01-01
    • 2018-07-16
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多