Me parece tão simples mas estou com dificuldades, eu tenho 4 váriáveis contendo objetos do tipo User
:
$systems
$teachers
$students
$pacients
Quero uni-las na váriavel $users
, o mesmo usuário pode estar em mais de uma destas 4 váriaveis e não consegui uma maneira simples de fazer isto.
Está confuso o que você está dizendo, você quer um lista, você quer um objeto, um array
? não conseguir saber o que é unir na sua idéia?
As váriáveis são arrays de objetos quando eu uso:
$users = (object) array_merge((array) $pacients);
ou
foreach( $pacients as $pacient => $users );
Dá erro na hora de ler as propriedades do objeto.
1 curtida
Você pode colocar o exemplo dessas variáveis?
A função está assim no Laravel:
public function type_user(Request $request) {
$users=[];
$search="";
if($request->system=='1'){
$systems = User::where([
[ 'system', 'like', '%'.'1'.'%' ]
])->get();
//$users = (object) array_merge((array) $systems);
foreach( $systems as $system => $users );
}
if($request->teacher=='1'){
$teachers = User::where([
[ 'teacher', 'like', '%'.'1'.'%' ]
])->get();
//$users = (object) array_merge((array) $teachers);
foreach( $teachers as $teacher => $users );
}
if($request->student=='1'){
$students = User::where([
[ 'student', 'like', '%'.'1'.'%' ]
])->get();
//$users = (object) array_merge((array) $students);
foreach( $students as $student => $users );
}
if($request->pacient=='1'){
$pacients = User::where([
[ 'pacient', 'like', '%'.'1'.'%' ]
])->get();
//$users = (object) array_merge((array) $pacients);
foreach( $pacients as $pacient => $users );
}
return view('users/show',['users' => $users, 'search' => $search]);
}
system
, teacher
, student
e pacient
são campos booleanos no banco de dados.
No Laravel é bem fácil.
Utilize a função collect
para criar uma coleção de dados, exemplo:
$users = collect([]); // função collect
if($request->system=='1') {
$systems = User::where([
[ 'system', 'like', '%'.'1'.'%' ]
])->get();
foreach( $systems as $system) {
$users->push($system); // adicionando na coleção
}
}
Se não quiser a função collect
(que é classe de coleção do Laravel ) e continuar array
faça no foreach
assim:
$users = [];
if($request->system=='1') {
$systems = User::where([
[ 'system', 'like', '%'.'1'.'%' ]
])->get();
foreach( $systems as $system) {
array_push($users, $system); adicionando no array
}
}
Observação: exemplo de um if tem que colocar todos o mesma lógica de código
https://www.php.net/manual/en/function.array-push.php
Eu faria talvez bem melhor que tudo isso utilizando union
unido esses resultados via Eloquent SQL trazendo apenas um resultado com todas as informações?
public function type_user(Request $request)
{
$users = User::query();
if($request->system=='1'){
$systems = User::where([
[ 'system', 'like', '%'.'1'.'%' ]
]);
$users = $users->union($systems);
}
if($request->teacher=='1'){
$teachers = User::where([
[ 'teacher', 'like', '%'.'1'.'%' ]
]);
$users = $users->union($teachers);
}
if($request->student=='1'){
$students = User::where([
[ 'student', 'like', '%'.'1'.'%' ]
]);
$users = $users->union($students);
}
if($request->pacient=='1'){
$pacients = User::where([
[ 'pacient', 'like', '%'.'1'.'%' ]
]);
$users = $users->union($pacients);
}
return view('users/show',['users' => $users->get(), 'search' => $search]);
}
Um fator importante nunca use type_user
utilize typeUser
que é a nomenclatura base utilizada no Laravel é um padrão (não é obrigatório)!
Muito obrigado Dragoon!!!
Eu tinha conseguido usando foreach:
foreach( $pacients as $pacient){
$users[]=$pacient;
}
Só que desta maneira quando o usuário era aluno e paciente, por exemplo, ele aparecia duas vezes na lista.
Union não funcionou com Array.
e a função push, também duplica os integrantes da lista.
Com todo respeito você não está usando corretamente o Laravel e tudo que eu te passei funciona sim, é que você não soube utilizar e na verdade o union com Eloquent gera o array sem que você precise fazer nada!
A questão do duplicação na minha visão falta conhecimento do projeto que você não disse!
Reafirmando funciona tudo o que eu passei pra você
Pois é… Estou estudando, vou tentar de novo.
Fiz desta maneira e funcionou…
public function typeUser(Request $request) {
$users=array();
$search="";
if($request->system==1){
$systems = User::where([
[ 'system', 'like', '%'.'1'.'%' ]
])->get();
foreach( $systems as $system){
array_push($users, $system);
}
}
if($request->teacher==1){
$teachers = User::where([
[ 'teacher', 'like', '%'.'1'.'%' ]
])->get();
foreach( $teachers as $teacher){
array_push($users, $teacher);
}
}
if($request->student==1){
$students = User::where([
[ 'student', 'like', '%'.'1'.'%' ]
])->get();
foreach( $students as $student){
array_push($users, $student);
}
}
if($request->pacient==1){
$pacients = User::where([
[ 'pacient', 'like', '%'.'1'.'%' ]
])->get();
foreach( $pacients as $pacient){
array_push($users, $pacient);
}
}
$result=array_unique($users);
return view('users/show',['users' => $result, 'search' => $search]);
}
Alguma observação?
Com union dá a seguinte mensagem:
Method Illuminate\Database\Eloquent\Collection::getBindings does not exist.
1 curtida
Dragoon
Agosto 25, 2022, 6:23pm
#11
Você criou um Query primeiramente na variável $users
?
Depois você atribui as variáveis $system
, $teachers
, $students
e $pacients
se houve necessidade pelo filtro?
No final se deu um $users->get()
?
Onde exatamente deu o erro, qual linha?
public function type_user(Request $request)
{
$users = User::query(); // criando um Query
if($request->system=='1'){
$systems = User::where([
[ 'system', 'like', '%'.'1'.'%' ]
]);
$users = $users->union($systems); // unindo resultados de $system
}
if($request->teacher=='1'){
$teachers = User::where([
[ 'teacher', 'like', '%'.'1'.'%' ]
]);
$users = $users->union($teachers); // unindo resultados de $teacher
}
if($request->student=='1'){
$students = User::where([
[ 'student', 'like', '%'.'1'.'%' ]
]);
$users = $users->union($students); // unindo resultados de $students
}
if($request->pacient=='1'){
$pacients = User::where([
[ 'pacient', 'like', '%'.'1'.'%' ]
]);
$users = $users->union($pacients); // unindo resultados de $pacients
}
return view('users/show',['users' => $users->get(), 'search' => $search]);
}
Agora funcionou com o union também.
o erro estava aqui:
$users->union($systems);
o correto é:
$users = $users->union($systems); // unindo resultados de $system
Obrigado professor Dragoon!
1 curtida