如何使用 MySQL `joins` 或 Laravel `relationships` 检索我想要的信息?
How can I retrieve the information I want using MySQL `joins` or Laravel `relationships`?
我正在使用 Laravel
框架开发一个项目。在这个项目中我有三个表:
1) 主部件号 (master_part_numbers)
列:id,part_number
值:1,MS26778-042
2)库存(库存)
列:id、master_part_number、stock_qty
值:1、1、7
3) 库存最小最大值 (inventory_min_maxes)
列:id、master_part_number、min_qty
值:1、1、10
我正在尝试查找库存水平低于 min_qty 的库存。我一直在尝试使用 joins
,像这样:
$test = MasterPartNumber::table('master_part_numbers')
->join('inventory', 'master_part_numbers.id', '=', 'inventory.master_part_number_id')
->join('inventory_min_maxes', 'master_part_numbers.id', '=', 'inventory_min_maxes.master_part_number_id')
->select('master_part_numbers.part_number')
->where('inventory.stock_qty', '<=', 'inventory_min_maxes.min_qty')
->get();
但是我每次都是空的collection
。我已经尝试删除 where()
条款,并且我得到了库存中的所有零件号,所以感觉我在正确的轨道上,但缺少一个关键组件。
此外,我不知道使用 Laravel 的 Eloquent 关系是否有更简单或更有效的方法,但该选项可用。
注意:为了便于阅读,我特意在此处显示的查询中的 table('master_part_numbers')
之后添加了 space。
编辑 1:
这个sql查询returns预期结果:
SELECT master_part_numbers.part_number
FROM master_part_numbers
JOIN inventory ON master_part_numbers.id=inventory.master_part_number_id
JOIN inventory_min_maxes ON master_part_numbers.id=inventory_min_maxes.master_part_number_id
WHERE inventory.stock_qty<=inventory_min_maxes.min_qty;
编辑 2:
在 Laravel IRC 的一些帮助下,我终于让它工作了,但是它并不理想,因为我错过了一些我想显示的数据,这些数据通常是通过关系收集的。
这是我目前正在使用的,但我希望得到重构:
DB::select(DB::raw('SELECT master_part_numbers.id, master_part_numbers.part_number, master_part_numbers.description, inventory.stock_qty, inventory.base_location_id, inventory_min_maxes.min_qty, inventory_min_maxes.max_qty
FROM master_part_numbers
JOIN inventory ON master_part_numbers.id = inventory.master_part_number_id
JOIN inventory_min_maxes ON master_part_numbers.id = inventory_min_maxes.master_part_number_id
WHERE inventory.stock_qty <= inventory_min_maxes.min_qty'));
如果我没有正确理解你的问题
'masters_part_numbers.id' == 'inventory.id' 和
'inventory.master_part_number' == 'inventory_min_maxes.master_part_number'
$test = DB::table('master_part_numbers')
->join('inventory', 'master_part_numbers.id', '=', 'inventory.id')
->join('inventory_min_maxes', 'inventory.master_part_number', '=', 'inventory_min_maxes.master_part_number')
->where('inventory.stock_qty', '<=', 'inventory_min_maxes.min_qty')
->whereNotNull('inventory_min_maxes.master_part_number');
->select(DB::raw('part_number'))
->get();
基于上述标准。此代码将起作用。我试过 laravel 5.4 。
试试让我知道。如果它有效给我竖起大拇指
我发现了一种使用 Laravel
->whereRAW()
语句解决此问题的方法:
$test = $inventory->join('inventory_min_maxes', 'inventory.id', '=', 'inventory.inventory_min_max_id')
->whereRaw('inventory.stock_qty <= inventory_min_maxes.min_qty')
->whereRaw('inventory.inventory_min_max_id = inventory_min_maxes.id') // required so it tests against the specific record, without it will test against all records.
->get();
对我来说主要的好处是,除了之前看起来非常丑之外,我现在可以使用 relationships
的力量。
注意: $inventory 是我的 Inventory
模型的一个实例,我在 index()
方法中键入提示。
我正在使用 Laravel
框架开发一个项目。在这个项目中我有三个表:
1) 主部件号 (master_part_numbers)
列:id,part_number
值:1,MS26778-042
2)库存(库存)
列:id、master_part_number、stock_qty
值:1、1、7
3) 库存最小最大值 (inventory_min_maxes)
列:id、master_part_number、min_qty
值:1、1、10
我正在尝试查找库存水平低于 min_qty 的库存。我一直在尝试使用 joins
,像这样:
$test = MasterPartNumber::table('master_part_numbers')
->join('inventory', 'master_part_numbers.id', '=', 'inventory.master_part_number_id')
->join('inventory_min_maxes', 'master_part_numbers.id', '=', 'inventory_min_maxes.master_part_number_id')
->select('master_part_numbers.part_number')
->where('inventory.stock_qty', '<=', 'inventory_min_maxes.min_qty')
->get();
但是我每次都是空的collection
。我已经尝试删除 where()
条款,并且我得到了库存中的所有零件号,所以感觉我在正确的轨道上,但缺少一个关键组件。
此外,我不知道使用 Laravel 的 Eloquent 关系是否有更简单或更有效的方法,但该选项可用。
注意:为了便于阅读,我特意在此处显示的查询中的 table('master_part_numbers')
之后添加了 space。
编辑 1:
这个sql查询returns预期结果:
SELECT master_part_numbers.part_number
FROM master_part_numbers
JOIN inventory ON master_part_numbers.id=inventory.master_part_number_id
JOIN inventory_min_maxes ON master_part_numbers.id=inventory_min_maxes.master_part_number_id
WHERE inventory.stock_qty<=inventory_min_maxes.min_qty;
编辑 2:
在 Laravel IRC 的一些帮助下,我终于让它工作了,但是它并不理想,因为我错过了一些我想显示的数据,这些数据通常是通过关系收集的。
这是我目前正在使用的,但我希望得到重构:
DB::select(DB::raw('SELECT master_part_numbers.id, master_part_numbers.part_number, master_part_numbers.description, inventory.stock_qty, inventory.base_location_id, inventory_min_maxes.min_qty, inventory_min_maxes.max_qty
FROM master_part_numbers
JOIN inventory ON master_part_numbers.id = inventory.master_part_number_id
JOIN inventory_min_maxes ON master_part_numbers.id = inventory_min_maxes.master_part_number_id
WHERE inventory.stock_qty <= inventory_min_maxes.min_qty'));
如果我没有正确理解你的问题 'masters_part_numbers.id' == 'inventory.id' 和 'inventory.master_part_number' == 'inventory_min_maxes.master_part_number'
$test = DB::table('master_part_numbers')
->join('inventory', 'master_part_numbers.id', '=', 'inventory.id')
->join('inventory_min_maxes', 'inventory.master_part_number', '=', 'inventory_min_maxes.master_part_number')
->where('inventory.stock_qty', '<=', 'inventory_min_maxes.min_qty')
->whereNotNull('inventory_min_maxes.master_part_number');
->select(DB::raw('part_number'))
->get();
基于上述标准。此代码将起作用。我试过 laravel 5.4 。 试试让我知道。如果它有效给我竖起大拇指
我发现了一种使用 Laravel
->whereRAW()
语句解决此问题的方法:
$test = $inventory->join('inventory_min_maxes', 'inventory.id', '=', 'inventory.inventory_min_max_id')
->whereRaw('inventory.stock_qty <= inventory_min_maxes.min_qty')
->whereRaw('inventory.inventory_min_max_id = inventory_min_maxes.id') // required so it tests against the specific record, without it will test against all records.
->get();
对我来说主要的好处是,除了之前看起来非常丑之外,我现在可以使用 relationships
的力量。
注意: $inventory 是我的 Inventory
模型的一个实例,我在 index()
方法中键入提示。