【问题标题】:One query to retrieve values from multiple tables一个查询从多个表中检索值
【发布时间】:2018-05-26 15:38:55
【问题描述】:

我一直在尝试从多个表中检索数据,在我遇到使用数据透视表(或多对多关系表之间的链接表)的挑战之前,一切都很清晰。

到目前为止,我可以轻松地从每个表中获取数据,但我只需要进行一次查询,它将获取我需要的所有数据。

表格 = 产品、详细信息、类别、product_category(这是一个数据透视表)

product_category = product_id | category_id(这些列中的每一列都在 id 上引用 - product_id 在产品上,category_id 在类别上)

获取查询的代码:

$products = DB::table('products')
                    ->join('details', 'products.id', '=', 'details.product_id')
                    ->leftJoin('product_category', function($join) {
                        $join->on('products.id', '=', 'product_category.product_id');
                    })
                    ->select('products.*', 'details.*', 'product_category.*')
                    ->orderBy('products.created_at', 'desc')
                    ->paginate(10);

然后在索引页面上,我可以获取 foreach 循环中的所有数据,但有一个小问题 - 我只能获取 product_category 的列,换句话说,只有 category_id 引用了 categories.id - 但我需要获取那些类别表中的值。

请不要给我文档或类似的东西,我每次在提出问题之前都会进行大量研究并阅读至少十几个类似的问答,但有时我需要另一种观点来获得解决方案并了解它是如何工作的。感谢每一个帮助。

【问题讨论】:

  • 您是否在模型中设置了任何关系?
  • 是的。所有关系都设置正确,正如我所说,我可以轻松获取数据,只是不知道如何混合它并获得单个查询。

标签: mysql laravel laravel-query-builder


【解决方案1】:

问题正在覆盖您的列信息。

您可以像这样修改您的查询:

$query = DB::table('product_category as pc')
    ->leftJoin('products as p', 'p.id', 'pc.product_id')
    ->join('details as d', 'd.product_id', 'p.id')
    ->select('p.id as product_id', 'p.name as product_name', 'd.id as details_id', .......) // <-- you need to select field whichever you want. table.* is applicable if tables have different column names.

【讨论】:

  • SQLSTATE[42S02]:未找到基表或视图:1146 表 'myproject.products as' 不存在(SQL:从 product_category 中选择 count(*) 作为聚合为 pc left join products as on p.id = pc.product_id)
  • 是的,我只是更新答案。可以试试更新代码吗?
  • 太棒了!像魅力一样工作。谢谢鲁特维·科塔里。如果我再问你一个问题,如果还有 5 个表,我应该在连接中指定它们还是需要更改整个代码?因为一开始有'product_category as pc',如果我也有product_tag呢?
  • Rutvij Kothari 好点!真的拯救了我的一天。再次感谢您的解决方案。 :)
  • 乐于助人。我花了将近 2 天的时间来解决同一类型的问题,以找出我的代码出了什么问题。 :D @MadMatt +1 回答你的问题。
猜你喜欢
  • 1970-01-01
  • 2010-10-13
  • 2012-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多