Makes a UNION
in the eloquent since by your code the returned fields are the same and the two queries would be with these changes:
$usuarios1 = DB::table('users')
->join('user_municipios', 'user_municipios.user_id', '=', 'users.id')
->join('municipios', 'municipios.id', '=', 'user_municipios.municipio_id')
->join('perfis', 'perfis.id', '=', 'users.perfil_id')
->select('users.id', 'users.municipio_id', 'users.name',
'users.minicurriculo','users.fotoPerfil',
'users.plano_id', 'perfis.perfil',
'municipios.municipio', 'municipios.uf')
->where('user_municipios.municipio_id', '=', $municipio_id);
$usuarios = DB::table('users')->where('users.municipio_id', '=', $municipio_id)
->join('municipios', 'municipios.id', '=', 'users.municipio_id')
->join('perfis', 'perfis.id', '=', 'users.perfil_id')
->select('users.id', 'users.municipio_id', 'users.name',
'users.minicurriculo','users.fotoPerfil',
'users.plano_id', 'perfis.perfil',
'municipios.municipio', 'municipios.uf')
->orderBy('users.plano_id', 'DESC')
->inRandomOrder()
->union($usuarios1); //juntando as duas consultas ...
->get(25);
but, that way the paginate
that you need does not work, because of the peculiar generation of SQL that is made by this method, but, there is a way to get around this:
$usuarios1 = DB::table('users')
->join('user_municipios', 'user_municipios.user_id', '=', 'users.id')
->join('municipios', 'municipios.id', '=', 'user_municipios.municipio_id')
->join('perfis', 'perfis.id', '=', 'users.perfil_id')
->select('users.id', 'users.municipio_id', 'users.name',
'users.minicurriculo','users.fotoPerfil',
'users.plano_id', 'perfis.perfil',
'municipios.municipio', 'municipios.uf')
->where('user_municipios.municipio_id', '=', $municipio_id);
$usuarios = DB::table('users')->where('users.municipio_id', '=', $municipio_id)
->join('municipios', 'municipios.id', '=', 'users.municipio_id')
->join('perfis', 'perfis.id', '=', 'users.perfil_id')
->select('users.id', 'users.municipio_id', 'users.name',
'users.minicurriculo','users.fotoPerfil',
'users.plano_id', 'perfis.perfil',
'municipios.municipio', 'municipios.uf')
->orderBy('users.plano_id', 'DESC')
->inRandomOrder()
->union($usuarios1);
Now with the union in the variable $usuarios
do the following:
$sql = $usuarios->toSql();
$res = \DB::table(\DB::raw("($sql order by users.plano_id) a"))
->mergeBindings($usuarios->getQuery());
return $res->paginate(25);
Code in full:
$usuarios1 = DB::table('users')
->join('user_municipios', 'user_municipios.user_id', '=', 'users.id')
->join('municipios', 'municipios.id', '=', 'user_municipios.municipio_id')
->join('perfis', 'perfis.id', '=', 'users.perfil_id')
->select('users.id', 'users.municipio_id', 'users.name',
'users.minicurriculo','users.fotoPerfil',
'users.plano_id', 'perfis.perfil',
'municipios.municipio', 'municipios.uf')
->where('user_municipios.municipio_id', '=', $municipio_id);
$usuarios = DB::table('users')->where('users.municipio_id', '=', $municipio_id)
->join('municipios', 'municipios.id', '=', 'users.municipio_id')
->join('perfis', 'perfis.id', '=', 'users.perfil_id')
->select('users.id', 'users.municipio_id', 'users.name',
'users.minicurriculo','users.fotoPerfil',
'users.plano_id', 'perfis.perfil',
'municipios.municipio', 'municipios.uf')
->orderBy('users.plano_id', 'DESC')
->inRandomOrder()
->union($usuarios1);
$sql = $usuarios->toSql();
$res = \DB::table(\DB::raw("($sql order by users.plano_id) a"))
->mergeBindings($usuarios->getQuery());
return $res->paginate(25);
Observing: that orderBy
with inRandomOrder
it will never work, or one or the other and I left as it was the right maybe be done in $res
thus:
return $res->inRandomOrder()->paginate(25);
Reference
Why don’t you put an Or on the Where?
– novic
It did not work, because the second query 1 of a Join in the table user_municipios and the query 2 no.
– Bruno Santos