unir objetos multidimensional array_combine array php laravel eloquent laravel-collection

objetos - unir dos arrays php



¿Cómo fusionar dos colecciones elocuentes? (5)

Combine dos colecciones elocuentes diferentes en una y algunos objetos tienen la misma identificación, una sobrescribirá la otra. En su lugar, utilice el método push () o reconsidere su enfoque del problema para evitarlo. medium.com/@tadaspaplauskas/…

Tengo una tabla de preguntas y una tabla de etiquetas. Quiero recuperar todas las preguntas de las etiquetas de una pregunta determinada. Entonces, por ejemplo, puedo tener las etiquetas "Viajes", "Trenes" y "Cultura" adjuntas a una pregunta dada. Quiero poder obtener todas las preguntas para esas tres etiquetas. Lo complicado, por lo que parece, es que la relación entre las preguntas y las etiquetas se define de muchos a muchos en Elocuente como pertenece a muchos.

Pensé en tratar de fusionar las colecciones de preguntas de la siguiente manera:

foreach ($question->tags as $tag) { if (!isset($related)) { $related = $tag->questions; } else { $related->merge($tag->questions); } }

Aunque no parece funcionar. No parece fusionar nada. ¿Estoy intentando esto correctamente? Además, ¿existe tal vez una mejor manera de obtener filas de filas en una relación de muchos a muchos en Eloquent?


El método merge() en la Collection no modifica la colección en la que fue llamado. Devuelve una nueva colección con los nuevos datos combinados. Necesitaría:

$related = $related->merge($tag->questions);

Sin embargo, creo que estás abordando el problema desde el ángulo equivocado.

Dado que está buscando preguntas que cumplan con ciertos criterios, probablemente sería más fácil realizar consultas de esa manera. Los métodos has() y whereHas() se utilizan para generar una consulta basada en la existencia de un registro relacionado.

Si solo estuviera buscando preguntas que tuvieran alguna etiqueta, usaría el método has() . Ya que está buscando preguntas con una etiqueta específica, usaría whereHas() para agregar la condición.

Por lo tanto, si desea todas las preguntas que tienen al menos una etiqueta con ''Viaje'', ''Trenes'' o ''Cultura'', su consulta sería:

$questions = Question::whereHas(''tags'', function($q) { $q->whereIn(''name'', [''Travel'', ''Trains'', ''Culture'']); })->get();

Si quisiera todas las preguntas que tenían las tres etiquetas, su consulta se vería así:

$questions = Question::whereHas(''tags'', function($q) { $q->where(''name'', ''Travel''); })->whereHas(''tags'', function($q) { $q->where(''name'', ''Trains''); })->whereHas(''tags'', function($q) { $q->where(''name'', ''Culture''); })->get();


El método de combinación devuelve la colección combinada, no muta la colección original, por lo tanto, debe hacer lo siguiente

$original = new Collection([''foo'']); $latest = new Collection([''bar'']); $merged = $original->merge($latest); // Contains foo and bar.

Aplicando el ejemplo a tu código.

$related = new Collection(); foreach ($question->tags as $tag) { $related = $related->merge($tag->questions); }


Todos no funcionan para mí en colecciones elocuentes , laravel las colecciones elocuentes usan la clave de los elementos que creo que causan problemas de fusión, necesita recuperar la primera colección como una matriz, ponerla en una colección nueva y luego empujar a las otras en la nueva colección;

public function getFixturesAttribute() { $fixtures = collect( $this->homeFixtures->all() ); $this->awayFixtures->each( function( $fixture ) use ( $fixtures ) { $fixtures->push( $fixture ); }); return $fixtures; }


$users = User::all(); $associates = Associate::all(); $userAndAssociate = $users->merge($associates);