在 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
表,但我也想加入文档,所以我可以向客户显示在orders
的file_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'