PHP,Laravel 连接两个查询的结果,并有选择地显示在 html/blade 表中
Posted
技术标签:
【中文标题】PHP,Laravel 连接两个查询的结果,并有选择地显示在 html/blade 表中【英文标题】:PHP, Laravel join results of two queries and display it selectively in a html/blade table 【发布时间】:2018-02-24 15:30:35 【问题描述】:我正在尝试合并/加入两个(最好是更多)查询的结果。然后有选择地在我的刀片视图中的表格中显示它,只选择几列/属性。我正在尝试在 Laravel、eloquent/querybuilder 中执行此操作(我可以在纯 sql 中执行此操作,但这当然不是重点),因为它将使用多个数据库和表,可能在多个服务器上。 重点:这里有一些代码:
$query1 = Documents::join('warehouses', 'analyticsData.documents.warehouse', '=', 'analyticsData.warehouses.id')
->selectRaw(
' analyticsData.warehouses.name name,
analyticsData.documents.warehouse number,
SUM(analyticsData.documents.value) takings1'
)
->whereIn('analyticsData.documents.type', [1, 4, 5])
->whereDate('date', '>=', '2016-09-05')
->whereDate('date', '<=', '2016-09-10')
->limit('5000')
->groupBy('name1')
->get();
$query2 = Documents::join('warehouses', 'analyticsData.documents.warehouse', '=', 'analyticsData.warehouses.id')
->selectRaw(
' analyticsData.warehouses.name name,
analyticsData.documents.warehouse number,
SUM(analyticsData.documents.value) takings2')
->whereIn('analyticsData.documents.type', [1, 4, 5])
->whereDate('date', '>=', '2017-09-04')
->whereDate('date', '<=', '2017-09-09')
->limit('5000')
->groupBy('name1')
->get();
然后,通过 foreach 循环,我想在刀片的表格中的屏幕上显示选定的结果列。 实际上,我已经使用了几天,并尝试将结果作为数组与 array_merge 合并,但它只是将一个数组附加到另一个数组的末尾。我需要相当于 SQL 中的“(右)加入”。 “名称”和“编号”列是相同的。 坦率地说,集合或数组方法及其组合似乎都不起作用。 我将非常感谢任何帮助。
附言。此外,如果有人碰巧知道我如何不能从特定查询中的列中获取值的总和,而不是使用 selectRaw,我会欣喜若狂。
【问题讨论】:
你能合并吗?有什么问题? 我不能使用'combine',因为数组(如果我将它们转换成数组)是不均匀的。我需要一个完全等同于 sql 'join' 的东西。或者是一种正确显示它的方法 - 一列紧挨着另一列。 明确一点:array_combine():两个参数应该有相同数量的元素 【参考方案1】:我使用查询生成器进行了多次连接。
这是我的代码:
$result = DB::table('sub_categories')->join('categories', 'sub_categories.category_id', '=', 'categories.id')
->join('main_categories', 'main_categories.id', '=', 'categories.main_category_id')
->where([['main_categories.text', '=', $mainCategory], ['categories.text', '=', $category], ['sub_categories.text', '=', $subCategory]])
->select('sub_categories.id as subject_id')->get();
这个可能会有所帮助:
$result = DB::table('users')->where([['users.user_id', $userId], ['ad_is_verified', true]])
->join('ads', 'ads.user_id', '=', 'users.user_id')
->where('ads.ad_id', '=', $addId)->get();
【讨论】:
谢谢,但问题是,我的最终目标是加入几对表,然后加入这些连接(我希望这很清楚)。一个表与其他几个表的多个连接不是我想要的。我需要找到一种方法来加入几个查询的结果集。或者找到一种方法在表格中选择性地显示合并数组的结果。事实上,如果我可以对不均匀/不相等的数组执行“组合”,我认为它会解决它。但显然不能对具有不同数量元素的数组执行“组合”。 你应该使用联合来代替加入。 这不是我想到的解决方案,我不确定在这种情况下“联合”是否应该工作。尽管如此,我似乎无法对我的代码应用联合,但预期 \Closure|\Illuminate\Database\Query\Builder,得到了 \App\ModelsAnalyticsData\Documents[]|\Illuminate\Database\Eloquent\Collection|\Illuminate\Database \Query\Builder[]|\Illuminate\Support\Collection。调用参数类型与声明不兼容。 最后一条评论 - 在我完成查询后,我设法对集合与结果进行了“联合”。但是 - 如果解决方案是我正在寻找的,我将不得不仔细观察。因为一开始我并不这么认为。 我实际上需要查询中的所有数据。联盟当然会用另一个数据替换集合中的一些数据。简而言之,一组包含商店名称和一个时期的收入,另一组包含商店名称和另一个时期的收入。现在 - 在其中一个集合中,商店可能有收入,而在另一个集合中,同一商店的收入可能等于 null。我需要两个时期的数据。以上是关于PHP,Laravel 连接两个查询的结果,并有选择地显示在 html/blade 表中的主要内容,如果未能解决你的问题,请参考以下文章
Laravel查询以输出json数据作为选择列表。如何修改现有代码以连接两个值
Laravel 5.3 查询从通过外键连接的 4 个表中获取结果
如何使用 Laravel8 中的 Twig 扩展注入 php GraphQL 查询结果,在 Twig(Bridge) 模板中定义查询?