我正在使用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 Relationships是否有更简单或更有效的方法来做到这一点,但该选项可用。
注意:为了便于阅读,我在此处显示的查询中table('master_part_numbers')
之后添加了空格,以便于阅读。
编辑1:
此sql查询返回期望结果:
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'));
答案 0 :(得分:0)
如果我已正确理解您的问题,那么 &#39; masters_part_numbers.id&#39; ==&#39; inventory.id&#39;和 &#39; inventory.master_part_number&#39; ==&#39; inventory_min_maxes.master_part_number&#39;
$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。 试试让我知道。如果它的工作给我竖起大拇指
答案 1 :(得分:0)
我发现了一种使用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()
方法中输入了该类型。