【问题标题】:Perform query with join and comma separated values in column in Laravel在 Laravel 的列中使用连接和逗号分隔值执行查询
【发布时间】:2017-12-23 04:37:38
【问题描述】:

我有表orders,其中包含列文件。该列包含文件 ID,它们以逗号分隔。

第二张表是documents

表名:订单

 orders_id | order_details | file_id
 ------------------------------------
     1     | some details  |   1,2    

表名:文档

 id |   name 
 ------------------
  1 | file name
  2 | file2 name2

目前我有这个查询,它只查询orders 表,但我也想加入文档,所以我可以向客户显示在ordersfile_id 列中连接的文档的名称

$docomuntOrders = Order::where('user_id',getCurrentUser()->user_id)
                        ->orderBy('order_id', 'DESC')
                        ->paginate(10);

你能在这里指导一下吗?

【问题讨论】:

  • 如果处于开发阶段,您应该在文档表中使用order_id 来定义关系。其他明智的json 可能是另一个不错的选择
  • documents 是分隔表。当我通过管理面板上传文档时存储在那里。我不知道order_id,我不需要知道。我不确定我是否理解你。
  • 您可以使用array_map 获取一列的file_id,但很难获取。

标签: mysql laravel laravel-query-builder


【解决方案1】:

希望它对你有用。试试看

$docomuntOrders = \DB::table("orders")
            ->select("orders.*",\DB::raw("GROUP_CONCAT(documents.name) as docname"))
            ->leftjoin("documents",\DB::raw("FIND_IN_SET(documents.id,orders.file_id)"),">",\DB::raw("'0'"))
            ->where('user_id',getCurrentUser()->user_id)
            ->groupBy("orders.id")
            ->paginate(10);

如果您尝试dd($docomuntOrders),希望它会返回所需的结果。

【讨论】:

  • 快速问题:例如,如何选择 document_name?当我做@foreach($downloadableOrders as $download) { $download->document_name } 时,我得到了 NULL
  • @user5996816 我更新了我的答案,我认为它已经为你准备好了:)
  • int(87) 这是我当前登录用户的正确 ID
  • 我也可以在dd($docomuntOrders) 中看到它,但是当我删除dd($docomuntOrders) 并尝试加载页面时出现上述错误
【解决方案2】:

一个用户有多个公司,公司 ID 位于 users 表中的单个字段中,以逗号分隔。在这种情况下,这就是解决方案,与您的问题非常相似。

Users::leftJoin("company_info as ci",\DB::raw("FIND_IN_SET(ci.id,users.company_ids)"),">",\DB::raw("'0'"))
    ->groupBy('users.id')
    ->get([
        'users.*',
        \DB::raw("GROUP_CONCAT(ci.company_name) as company_name")
    ]);

【讨论】:

    猜你喜欢
    • 2019-05-23
    • 2020-09-14
    • 2013-05-31
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多