【问题标题】:Laravel eloquent queryLaravel 雄辩的查询
【发布时间】:2018-01-26 02:15:30
【问题描述】:

我有 3 个表,分别名为 cash_managesoutletsdelivery_boys,结构是

        //outlets
        id name
        1  utha
        2  alabama

        //delivery_boys
        id outlet_id  name
        1     1       John 
        2     1       Mike
        3     2       Alex

        //cash_manage
        id   source_type   source_id   destination_id   status     amount
        1      admin          1             2            give       500 
        2      admin          2             1            give       350   
        3      deliveryBoy    1             2            receive    300 
        4      admin          2             2            give       500
        5      admin          2             1            give       800 
        6      user           1             1            give       600
        7      user           2             2            give       450

   //the logic
    1-> if source_type is admin then the source_id is outlet_id and the cash is **GIVEN** to destination_type delivery_boy_id

    2-> if source_type is deliveryBoy then the source_id is delivery_boy_id and the cash is **Received** by destination_type outlet_id(admin)

我想在视图中得到如下结果(带送货员的现金)

num   outlet   delivery_boy   cash_taken  cash_returned  cash_has 
1     alabama     John          1150          300          1050
2     alabama     mike          500           0            500

我加入了所有三个表,并且能够获得 Outlet NameDelivery Boy Name。 现在我被困在计算部分

public function index(Request $request) 
{
    $outlet_id = $request->outlet_id;

    $transaction_list = DeliveryCashManage::leftJoin('outlets','outlets.id','delivery_cash_manages.source_id')
                                          ->leftJoin('delivery_boys','delivery_boys.id','destination_id')
                                          ->where('source_type', 'admin')
                                          ->where('source_id', $outlet_id)
                                          ->select('delivery_cash_manages.id','outlets.name as outlet','delivery_boys.name as delivery_boy','amount')
                                          ->groupBy('delivery_boys.name')
                                          ->get();

    return view('pages.manager.cash');
}

我收到以下错误

SQLSTATE[42000]: Syntax error or access violation: 1055 Expression #1 of SELECT list is not in GROUP BY clause and contains nonaggregated column 'ideal_chicken.delivery_cash_manages.id' which is not functionally dependent on columns in GROUP BY clause; this is incompatible with sql_mode=only_full_group_by (SQL: select `delivery_cash_manages`.`id`, `outlets`.`name` as `outlet`, `delivery_boys`.`name` as `delivery_boy`, `amount` from `delivery_cash_manages` left join `outlets` on `outlets`.`id` = `delivery_cash_manages`.`source_id` left join `delivery_boys` on `delivery_boys`.`id` = `destination_id` where `source_type` = admin and `source_id` = 1 group by `destination_id`)

我认为我的查询或逻辑有误,请帮助解决此问题

谢谢

【问题讨论】:

  • 感谢您的回复非常感谢,我如何计算cash_takencash_returned。谢谢
  • 当源类型为 admin 时,这有点令人困惑,源 id 成为 outlets 表上的目标 id,这很好。但是现金是给destination_typedelivery_boy_id的……destination_type指的是什么?那是另一张桌子吗?我不确定如何将管理员记录准确地连接到送货员。另外,您正在寻找的结果是实际结果吗?或者它只是您正在寻找的一个示例并且具体数字是由组成的?
  • 另外,您的左连接似乎没有遵循您自己的规则。当源类型为 deliveryBoy 时,您说 source_id 是 delivery_boy_id 但您在 delivery_boys.id = destination_id 上加入这两个表
  • @user3158900 感谢您的回复,如果source_typeadmin 那么source_idoutlet_id 并且destination_id 是delivery_boy_id。如果source_typedeliveryBoy source_iddelivery_boy_id,destination_id 将是outlet_id

标签: php mysql laravel eloquent laravel-5.4


【解决方案1】:

这不是完整的答案,但很接近。不过,无论我如何处理数据,我都不知道您是如何提出cash_has 的。此外,我将其保留为原始 SQL,因为我觉得它会更有帮助,并且转换回查询生成器应该不难。我也不知道确切的列名,因此您可能需要修复其中的一些。

SELECT
    COALESCE(outlets_admin.name, outlets.name) AS outlet, 
    COALESCE(boys_admin.name, boys.name) AS delivery_boy,
    SUM(IF(cm.source_type = 'admin', amount, 0)) AS cash_taken,
    SUM(IF(cm.source_type = 'deliveryBoy', amount, 0)) AS cash_returned,
    SUM(IF(cm.source_type = 'admin', amount, 0)) - SUM(IF(cm.source_type = 'deliveryBoy', amount, 0)) AS cash_has
FROM delivery_cash_manages cm
LEFT JOIN outlets ON outlets.id = cm.destination_id AND cm.source_type = 'deliveryBoy'
LEFT JOIN delivery_boys boys ON boys.id = cm.source_id AND cm.source_type = 'deliveryBoy'
LEFT JOIN outlets outlets_admin ON outlets_admin.id = cm.source_id AND cm.source_type = 'admin'
LEFT JOIN delivery_boys boys_admin ON boys_admin.id = cm.destination_id AND cm.source_type = 'admin'
WHERE COALESCE(outlets.id, outlets_admin.id) = '2'  #  This is where you plug in your $outlet_id
GROUP BY outlet, delivery_boy

您在查询中遇到错误的原因是,如果您按任何内容进行分组,则需要按您选择的所有非聚合列(sum、max、avg 等函数)进行分组。

【讨论】:

  • 非常感谢您抽出宝贵的时间,我会试试看
  • cash_has 表示与送货员的现金,如果我们减去 cash_takencash_returned,我们不应该得到cash_has。谢谢
  • 该说法是错误的,您可以按出口分组并获得多个送货员的结果(只要您还按送货员分组,我们正在这样做)。但是,如果您确定要删除该组,那么您还需要删除 select for outlet,您应该停止收到该错误。
  • 我已更新我的答案以包括 cash_has。我有点认为这可能是您正在寻找的东西,但它与您预期的 1050/500 的结果不符。除非遗漏了一些细节,否则这个查询应该是正确的,尽管删除 where 子句并手动检查数字以确保它是正确的不会有什么坏处。
  • 这真的很奇怪,因为我将您提供的数据放在我制作的一些表中,然后运行我的查询,我看到了阿拉巴马州约翰和迈克的数据。如果我删除 where,我还可以在 utha 看到 Mike 的数据
猜你喜欢
  • 2021-07-23
  • 2017-11-11
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-24
  • 2021-06-17
相关资源
最近更新 更多