Unir váriáveis de objetos Laravel com Eloquent?

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
  • 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