如何使用连接从 3 级表中获取数据 [Laravel]
Posted
技术标签:
【中文标题】如何使用连接从 3 级表中获取数据 [Laravel]【英文标题】:How to get data from 3rd level table using joins [Laravel] 【发布时间】:2019-08-03 18:32:36 【问题描述】:我想使用 bd_products
的主键 (ID) 获取存储在 bd_product_item_ledgers 中的产品数量bd_products 链接到 bd_product_ledgers 然后,bd_product_ledgers 链接到 bd_product_item_ledgers
表:bd_products
---------------------------------------------------------------------------------
| id | name | description | image | created_at | updated_at
---------------------------------------------------------------------------------
| 1 | shoe | this is a shoe | 15243.jpg |
---------------------------------------------------------------------------------
表:bd_product_ledgers
---------------------------------------------------------------------------------
| id | product_id | cost | created_at | updated_at
---------------------------------------------------------------------------------
| 1 | 1 | 500.00 |
---------------------------------------------------------------------------------
表:bd_product_item_ledgers
---------------------------------------------------------------------------------
| id | product_ledger_id | quantity | created_at | updated_at
---------------------------------------------------------------------------------
| 1 | 1 | 200 |
---------------------------------------------------------------------------------
我可以得到产品的成本,因为那里有 ID,但我怎样才能得到数量呢?
简单的 mysql 查询或 Laravel 雄辩等任何东西都会很好。
谢谢!
【问题讨论】:
加入product_ledger_id.id
和bd_product_item_ledgers.product_ledger_id
- ps 这些是一些长列和表名。所以FROM bd_products JOIN bd_product_ledgers ON bd_products.id = bd_product_ledgers.product_id JOIN bd_product_item_ledgers ON product_ledger_id.id = bd_product_item_ledgers.product_ledger_id
如果您想象从顶部表格的第一列到第二个表格的第二列的对角线,则基本上使用您的表格。然后第二个表的第一列到第三个表的第二列。有点像之字形图案......哈哈
嗯,你是对的,这些是长列名。我犯了一个愚蠢的错误,我没有写正确的列名,这让我抓狂,我把问题放在这里。无论如何!无论如何感谢您的建议。 :) @ArtisticPhoenix
我的一般规则是每个表都有一个词来描述它,除非它是一个 Junction 表(多对多),每个表都有两个复数词。 bd_products
、bd_ledgers
和 bd_lineitems
正式注明。感谢您的知识:) @ArtisticPhoenix
【参考方案1】:
创建三个模型 Product、Item、ledgers 并在产品模型中定义您的关系分类帐,在分类帐模型中定义项目,而不是使用类似查询来获取数据,
$data = Product::with('ledgers.item')->get();
【讨论】:
所以它会按照您的建议从分类帐表中获取成本和从项目表中获取数量? @朋友 是的,使用 with 方法和关系,您将获得所需的数据,但您必须注意命名约定。 @Mohsin 好的。我也试试这种方式,它看起来更简洁明了。 @朋友【参考方案2】:我不确定,但我已经使用下表创建了演示项目并输入了您提供的数据
纯数据库外观版本
[如果您需要雄辩的方式,请分享 您的型号名称]
public function index()
$selctArray = [
'bd_products.name',
'bd_products.description',
'PRDLED.cost as productCost',
'PRDITLED.quantity as productQuantity',
];
$joinQuery = DB::table('bd_products')
->leftJoin('bd_product_ledgers as PRDLED','PRDLED.product_id','=','bd_products.id')
->leftJoin('bd_product_item_ledgers as PRDITLED','PRDITLED.product_ledger_id','=','PRDLED.id')
->select($selctArray)->get();
dd($joinQuery);
如果它没有满足您的要求,请在下方评论并改进您的问题
【讨论】:
我使用 lil 调整的方法相同。在产品模型中创建一个范围以获取所有产品,然后在 bd_product_ledgers 和 bd_product_item_ledgers 上应用连接。它就像一个魅力。 *********** public function scopeAllProducts($query) return $query->join('product_ledgers', 'products.id', '=', 'product_ledgers.product_id') ->join( 'product_item_ledgers'、'product_ledgers.id'、'='、'product_item_ledgers.product_ledger_id')->select('products.*'、'product_ledgers.cost AS op_cost'、'product_item_ledgers.quantity AS op_quantity'); *********** 是的,这很酷,范围工作正常,并尝试添加alais
非常清晰的名称,例如 bd_product_item_ledgers as PRDITLED
感谢您的回答 :) 是的,请记住使用别名 @Manojkiran.A
我不知道你为什么标记relation answer as accepted.
你只是要求joins
,这就是我所做的。 你没有要求关系
我在最后几行说过简单的 MySQL 查询或 laravel eloquent 等任何东西都会很好。所以@pal 提出了关于关系的建议,它也可以用更少的代码工作。尽管我确实赞成您的回答,因为它也是实现相同目标的另一种方式。接受的答案在一行中解决了问题。以上是关于如何使用连接从 3 级表中获取数据 [Laravel]的主要内容,如果未能解决你的问题,请参考以下文章
如何在 MVC 中使用 DB First Approach 从连接表中获取数据