我将尝试尽可能简化此过程,以便直截了当。如果您还有其他问题,请务必与我联系。
我有2张桌子,如下所示:
item_centers:
| id | center | identifier | description |
|----|--------|------------|--------------------|
| 1 | 1A | 0011 | Description for 1A |
| 2 | 1B | 0022 | Description for 1B |
| 3 | 1C | 0033 | Description for 1C |
物品中心可以以某种方式包含许多物品。该表中的“标识符”列表示以下“项目”表中的标识符列。因此,中心1A可以有许多“项目”,其标识符为0011。
项目:
| id | identifier | description | quantity |
|----|------------|--------------------|----------|
| 1 | 0011 | Description for 1A | 250 |
| 2 | 0022 | Description for 1B | 500 |
| 3 | 0033 | Description for 1C | 750 |
我有一个项目中心下拉列表,该列表按中心列出了“ item_centers”表中的所有项目中心。 (例如:1A)。除了该下拉菜单,我还有一个项目下拉列表,其中列出了包含“项目”表中关键字的所有唯一说明。在这两个下拉菜单下,我有一个文本框,允许用户输入他们要从所选“项目”中减去的数量。
当用户选择item_center,项目说明并单击“提交”时-我有一个执行此操作的过程: 1.从“项目”表中获取所有项目,并使用与从“项目中心”下拉列表中选择的项目相同的“标识符”。 2.在步骤1中汇总所有已检索项目的数量。 3.从最早的条目(created_at列)开始,从条目列表中减去用户输入的金额。
所以,我的问题...
我们有很多商品中心,其中包含数量为0的商品。我希望能够从数量为0的列表中删除所有商品中心,这样用户就不必对100进行排序项中心找到数量大于0的项。
这是我模拟的一个简单示例。这显然是一种可怕的方法,因为它正在运行大量查询,并且会超时。但这可能会更好地作为我在此处要实现的目标的模型。
public function index()
{
$itemCenters = ItemCenter::select(['id', 'center', 'identifier', 'description'])
->orderBy('center', 'asc')
->orderBy('description', 'asc')
->get();
$itemDescriptions = Item::select('description')
->where('description', 'LIKE', '% .$keyword. %')
->orWhere('description', 'LIKE', '.$keyword. %')
->orWhere('description', 'LIKE', '% $.$keyword.')
->distinct('description')
->orderBy('description', 'asc')
->get();
foreach ($itemCenters as $itemCenter)
{
foreach ($itemDescriptions as $itemDescription)
{
$currentQty = Item::where('identifier', $itemCenter->identifier)
->where('description', $itemDescription->description)
->sum('quantity');
if ($currentQty <= 0)
{
$itemCenter->forget($itemCenter->id);
}
}
}
return view('pages.ItemRemoval', compact('itemCenters'), compact('itemDescriptions'));
}
就像我之前说过的那样,这确实简化了流程-事情本来可以忽略的。因此,请让我知道是否有任何混淆。
答案 0 :(得分:0)
我认为做到这一点的最佳方法是使用laravel关系,如果不是这样的话
ItemCenter模型
public function items()
{
return $this->hasMany(Item::class);
}
项目模型
public function itemCenter()
{
return $this->belongsTo(ItemCenter::class);
}
因此,现在在表上,如果两个表上的identifier和description列相同,则可以将其删除,并用反映了item_centers表的id列的items表上的item_center_id foriegn键替换。
现在为了简化查询,我想应该是这样的
$item_centers = ItemCenter::with(['items' => function($query){
$query->havingRaw('SUM(quantity) <= 0 ');
}])->get();
答案 1 :(得分:0)
使用以下查询,您基本上不再需要foreach循环来过滤$ itemCenters。零个项目以及相应的item_centers已被过滤掉。
$itemCenters = DB::table('item_centers')
->join('items', 'item_centers.identifier', '=', 'items.identifier')
->select('item_centers.id as id', 'item_centers.center as center', 'item.identifier as identifier', 'item_centers.description as description', 'items.quantity as quantity')
->where('quantity', '<>', 0)
->orderBy('center', 'asc')
->orderBy('description', 'asc')
->get();
您可能需要为操作选择另一列(“ items.created_at as created_at”)。