如何使用 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() 方法中键入提示。