Tengo una serie de tablas de base de datos que almacenan información de estimación. Estoy tratando de devolver todos los datos de todas las tablas de la base de datos cuando se establecen ciertos perímetros.

Colección

        $estimateItems = new Collection();
    $estimateItems = $estimateItems->merge( $this->getBoxVent() );
    $estimateItems = $estimateItems->merge( $this->getCoatings() );
    $estimateItems = $estimateItems->merge( $this->getCounterFlashing() );
    $estimateItems = $estimateItems->merge( $this->getDripEdge() );
    $estimateItems = $estimateItems->merge( $this->getFasteners() );
    $estimateItems = $estimateItems->merge( $this->getHeadwallFlashing() );
    $estimateItems = $estimateItems->merge( $this->getHipcap() );
    $estimateItems = $estimateItems->merge( $this->getIceShield() );
    $estimateItems = $estimateItems->merge( $this->getPipeFlashing() );
    $estimateItems = $estimateItems->merge( $this->getRidgecap() );
    $estimateItems = $estimateItems->merge( $this->getRidgeVentilation() );
    $estimateItems = $estimateItems->merge( $this->getSheathing() );
    $estimateItems = $estimateItems->merge( $this->getShingles() );
    $estimateItems = $estimateItems->merge( $this->getSidewallFlashing() );
    $estimateItems = $estimateItems->merge( $this->getSkylights() );
    $estimateItems = $estimateItems->merge( $this->getStarterShingle() );
    $estimateItems = $estimateItems->merge( $this->getTearOff() );
    $estimateItems = $estimateItems->merge( $this->getUnderlayment() );
    $estimateItems = $estimateItems->merge( $this->getValleyMetal() );

enter image description here

Y recoger ()

$collectedItems = collect([
        $this->getBoxVent(),
        $this->getCoatings(),
        $this->getCounterFlashing(),
        $this->getDripEdge(),
        $this->getFasteners(),
        $this->getHeadwallFlashing(),
        $this->getHipcap(),
        $this->getIceShield(),
        $this->getPipeFlashing(),
        $this->getRidgecap(),
        $this->getRidgeVentilation(),
        $this->getSheathing(),
        $this->getShingles(),
        $this->getSidewallFlashing(),
        $this->getSkylights(),
        $this->getStarterShingle(),
        $this->getTearOff(),
        $this->getUnderlayment(),
        $this->getValleyMetal(),
    ]);

enter image description here

Solo hay 4 tablas de base de datos que tienen datos relacionados con esta "estimación" para este ejemplo. Lo ideal sería que 1 o todos tuvieran datos.

¿Por qué Collection solo devuelve un máximo de 3, mientras que collect los devuelve a todos incluso si están vacíos?

¿Estoy haciendo algo mal para que $estimateItems = new Collection(); solo devuelva 3, cuando hay 4 o más en la base de datos?

Aquí están las consultas que estoy usando.

    private function getBoxVent() {
    return ProposalBoxVent::where('proposalRecordID', $this->getProposalAPI())->get();
}

private function getCoatings() {
    return ProposalCoatings::where('proposalRecordID', $this->getProposalAPI())->get();
}

Si uso concat en lugar de merge obtengo los resultados deseados. ingrese la descripción de la imagen aquí

2
lzoesch 9 dic. 2019 a las 01:10

2 respuestas

La mejor respuesta

Creo que está teniendo problemas con el método de combinación en Laravel, la combinación funcionará de manera diferente si se trata de una matriz asociativa o una matriz indexada. Si está indexado, debería funcionar como concat. Si es una matriz asociativa, intentará fusionarla por la base de valor clave. Por lo tanto, creo que uno de sus métodos subyacentes devuelve algo incorrectamente.

Dicho esto, si está trabajando con matrices indexadas, concat es mejor y más rápido, ya que no tiene que verificarlo. Si desea fusionar ['apple' => 'green'] con ['banana' => 'yellow'] en ['apple' => 'green', 'banana' => 'yellow'], debe usar merge.

Con respecto a su pregunta, use concat en su lugar, si está trabajando con matrices indexadas. La fusión también puede tener un mal rendimiento en grandes sets.

$estimateItems = $estimateItems->concat($this->getBoxVent());
1
mrhn 8 dic. 2019 a las 22:36

Lo que pasa a collect() es la matriz que desea como 'elementos' de la Colección. Estás diciendo que quieres una Colección que contenga 18 artículos; Resulta que la mayoría de ellos están vacíos, pero eso no importa para la matriz o la Colección.

Cuando está fusionando, en realidad está fusionando los elementos actuales de la Colección con un nuevo conjunto de elementos. Al fusionar es posible que algo sobrescriba algo más en lugar de agregarlo a la Colección. Similar a cómo funciona array_merge ya que eso es lo que está sucediendo internamente. Las colecciones elocuentes se codifican con 'id'.

También es posible intentar usar values para restablecer las claves antes de fusionar:

$collection->merge($this->getValleyMetal()->values());
1
lagbox 8 dic. 2019 a las 22:42