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() );
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(),
]);
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.
2 respuestas
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());
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());
Preguntas relacionadas
Nuevas preguntas
laravel
Laravel es un marco web PHP gratuito y de código abierto, creado por Taylor Otwell y destinado al desarrollo de aplicaciones web siguiendo el patrón arquitectónico modelo-vista-controlador (MVC) y basado en Symfony. El código fuente de Laravel está alojado en GitHub y tiene licencia bajo los términos de la Licencia MIT.