在 Laravel 的列中使用连接和逗号分隔值执行查询

Posted

技术标签:

【中文标题】在 Laravel 的列中使用连接和逗号分隔值执行查询【英文标题】:Perform query with join and comma separated values in column in 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,但很难获取。 【参考方案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) 并尝试加载页面时出现上述错误 让我们continue this discussion in chat。【参考方案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")
    ]);

【讨论】:

以上是关于在 Laravel 的列中使用连接和逗号分隔值执行查询的主要内容,如果未能解决你的问题,请参考以下文章

包含逗号分隔值的列中的值

如何在laravel中使用逗号分隔值的列上使用'where'

如何在 Amazon Redshift 的列中取消嵌套/展开/展平逗号分隔值?

如何通过在表 A 的列中查找逗号分隔值来从表 B 返回值

如何根据两个逗号分隔值的列中的任何一个值获取记录

SQL查询以从逗号分隔的列中检索值[重复]