如何使用MySQL`joins`或Laravel`关系`检索我想要的信息?

时间:2017-07-14 02:36:55

标签: php mysql join laravel-5.1

我正在使用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')); 

2 个答案:

答案 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()方法中输入了该类型。