Eu tenho uma tabela de perguntas e uma tabela de tags. Eu quero buscar todas as perguntas das tags de uma determinada pergunta. Assim, por exemplo, posso ter as tags "Viagem", "Trens" e "Cultura" anexadas a uma determinada pergunta. Quero poder buscar todas as perguntas para essas três tags. O complicado, ao que parece, é que o relacionamento de perguntas e tags é um muitos-para-muitos definido no Eloquent como belongsToMany.
Pensei em tentar mesclar as Coleções de perguntas conforme abaixo:
foreach ($question->tags as $tag) {
if (!isset($related)) {
$related = $tag->questions;
} else {
$related->merge($tag->questions);
}
}
Mas não parece funcionar. Não parece fundir nada. Estou tentando fazer isso corretamente? Além disso, existe talvez uma maneira melhor de buscar uma linha de linhas em um relacionamento muitos para muitos no Eloquent?
php
laravel
eloquent
laravel-collection
Martyn
fonte
fonte
with
não vai ajudar. ÉwhereHas
isso que é necessário - como na resposta abaixo.Respostas:
O método merge retorna a coleção mesclada, não modifica a coleção original, portanto, você precisa fazer o seguinte
$original = new Collection(['foo']); $latest = new Collection(['bar']); $merged = $original->merge($latest); // Contains foo and bar.
Aplicando o exemplo ao seu código
$related = new Collection(); foreach ($question->tags as $tag) { $related = $related->merge($tag->questions); }
fonte
getKey
a resultados de mesclagem, entãoModel::all()->merge(Model::all())->count() === Model::all()->count()
O
merge()
método noCollection
não modifica a coleção na qual foi chamado. Ele retorna uma nova coleção com os novos dados mesclados. Você precisaria de:No entanto, acho que você está lidando com o problema do ângulo errado.
Como você está procurando perguntas que atendem a determinados critérios, provavelmente seria mais fácil fazer uma consulta dessa maneira. Os métodos
has()
ewhereHas()
são usados para gerar uma consulta com base na existência de um registro relacionado.Se você estivesse apenas procurando perguntas que possuíssem qualquer tag, usaria o
has()
método. Como você está procurando perguntas com uma tag específica, use owhereHas()
para adicionar a condição.Portanto, se você quiser todas as perguntas que tenham pelo menos uma tag com 'Viagem', 'Trens' ou 'Cultura', sua consulta será parecida com:
$questions = Question::whereHas('tags', function($q) { $q->whereIn('name', ['Travel', 'Trains', 'Culture']); })->get();
Se você quisesse todas as perguntas que tivessem todas essas três tags, sua consulta seria assim:
$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();
fonte
fonte
Junte duas coleções eloquentes diferentes em uma e alguns objetos terão o mesmo id, um substituirá o outro. Use o método push () ou repense sua abordagem para o problema para evitar isso. Consulte a web
fonte
Nem todas funcionam para mim em coleções eloquentes , coleções eloquentes laravel usam a chave dos itens que eu acho que causa problemas de mesclagem, você precisa obter a primeira coleção de volta como uma matriz, colocá-la em uma nova coleção e, em seguida, empurrar as outras para a nova coleção;
public function getFixturesAttribute() { $fixtures = collect( $this->homeFixtures->all() ); $this->awayFixtures->each( function( $fixture ) use ( $fixtures ) { $fixtures->push( $fixture ); }); return $fixtures; }
fonte
Criando uma nova coleção base para cada coleção eloquente que a fusão funciona para mim.
Nesse caso, não há conflitos por suas chaves primárias.
fonte