Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/video/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php Laravel雄辩-合并两个雄辩的模型结果(不是集合)_Php_Laravel_Eloquent_Query Builder_Laravel Query Builder - Fatal编程技术网

Php Laravel雄辩-合并两个雄辩的模型结果(不是集合)

Php Laravel雄辩-合并两个雄辩的模型结果(不是集合),php,laravel,eloquent,query-builder,laravel-query-builder,Php,Laravel,Eloquent,Query Builder,Laravel Query Builder,我有一张库存变动表,它显示了产品的历史记录(接收、移动位置等) 我有两个查询(通过合计金额)进行计算: 原始接收数量 当前活动数量(物品移动后) 这两个查询都返回相同模型的集合。它们在每一项中的结果数始终相同,并且产品id始终相同。唯一不同的部分是接收/活动数量,我想以某种方式将各个记录合并到一个新集合中。i、 e 查询1中的单个记录: 0 => StockMovement {#1602 ▼ #original: array:2 [▼ "live_qty" => "8"

我有一张库存变动表,它显示了产品的历史记录(接收、移动位置等)

我有两个查询(通过合计金额)进行计算:

  • 原始接收数量
  • 当前活动数量(物品移动后)
  • 这两个查询都返回相同模型的集合。它们在每一项中的结果数始终相同,并且产品id始终相同。唯一不同的部分是接收/活动数量,我想以某种方式将各个记录合并到一个新集合中。i、 e

    查询1中的单个记录:

    0 => StockMovement {#1602 ▼
      #original: array:2 [▼
        "live_qty" => "8"
        "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
      ]
    }
    
    查询2中的单个记录

    0 => StockMovement {#1602 ▼
      #original: array:2 [▼
        "received_qty" => "15"
        "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
      ]
    }
    
    我试图得到一个合并结果,如下所示:

    0 => StockMovement {#1602 ▼
      #original: array:3 [▼
        "received_qty" => "15"
        "live_qty" => "8"
        "product_id" => "2606598e-4150-461a-9e91-10d67cce8daa"
      ]
    }
    
    我希望这样做不会将产品对象转换为数组,因为我需要嵌入其中的关系

    目前,我已经对其进行了如下黑客攻击:

    $live = $this->liveQtyCollection();
    $merged = $this->receivedQtyCollection()->map(function(StockMovement $received) use($live){
        $line = $live->where('product_id', $received->product_id)->first();
        return arrayToObject(array_merge($received->toArray(), $line->toArray()));
    });
    return $merged;
    
    @foreach($stockMovements as $stockMovement)
        {{ $stockMovement->id }}
        {{ $stockMovement->live_qty }}
        {{ $stockMovement->received_qty }}
    @endforeach
    
    arrayToObject
    函数递归地将数组转换回一个对象,这样我就可以像使用原始集合时一样使用箭头选择器,但我相信一定有更好的方法

    我试过:

    • 合并
    • 联合
    • 全部
    我的最终目标是能够按如下方式使用生成的集合:

    $live = $this->liveQtyCollection();
    $merged = $this->receivedQtyCollection()->map(function(StockMovement $received) use($live){
        $line = $live->where('product_id', $received->product_id)->first();
        return arrayToObject(array_merge($received->toArray(), $line->toArray()));
    });
    return $merged;
    
    @foreach($stockMovements as $stockMovement)
        {{ $stockMovement->id }}
        {{ $stockMovement->live_qty }}
        {{ $stockMovement->received_qty }}
    @endforeach
    
    您可以使用以下代码:

    $collection = collect();
    $cars = Car::all();
    $bikes = Bike::all();
    
    foreach ($cars as $car)
        $collection->push($car);
    
    foreach ($bikes as $bike)
        $collection->push($bike);
    

    您可以这样做:

    $live = $this->liveQtyCollection()->keyBy('product_id')
    $merged = $this->receivedQtyCollection()->map(function(StockMovement $received) use($live){
        $received->live_qty = $live->get($received->product_id)->live_qty ?? null;
        return $received;
    });
    

    我知道你在你的问题中提到,你不是指集合,而且你已经尝试过合并,但为了讨论,我想我会把我的答案放在混合中,因为这正是我所需要的;合并两个模型调用的响应

    $quote = \App\AllQuotes::withoutGlobalScopes()->find($quote_id);
    $settings = \App\Settings::findOrFail(1);
    $settings = collect($settings);
    $quote = collect($quote);
    $merged = $quote->merge($settings);
    
    return $merged;
    

    您必须首先使用
    collect
    helper将模型响应封装为集合,然后才能将它们合并在一起。然后,输出将其视为一个逻辑联接,将来自两个模型的数据保持在一个单独的输出中。

    “Eloquent返回的所有多结果集都是Lightlight\Database\Eloquent\Collection对象的实例”。你为什么说不收集?我想我认为收集是“雄辩的模型结果的收集”。我想确保我不会将stockMovement模型分解为数组或普通集合,即我想通过product_Š保留其所有关系功能,例如
    $stockMovement->product->title
    ,其中stockMovement属于某个产品,我想您可以尝试以下方法:@loic.lopez谢谢。我已经知道什么是关系了。我只是尝试合并上面两个查询,同时保持关系完整。如果在合并之前转换为数组,则关系将丢失。