2016-08-22 2 views
0

Ich benutze Laravel 5 und ich habe eine Tabelle von Benutzern und zwei Tabellen "Clients" und "Mitarbeiter", die Beziehungen zwischen Benutzern enthalten.Get Laravel Eloquent Collection von rohen Abfrage

Ich möchte alle Kunden und Mitarbeiter des angemeldeten Benutzers erhalten.

Ich habe eine rohe Abfrage, die für das einwandfrei funktioniert:

select users.* from clients, users 
where clients.id_marchand = 8 and users.id = clients.id_client 
union 
select users.* from employes, users 
where employes.id_marchand = 8 and users.id = employes.id_employe 
order by `seen` asc, `created_at` desc limit 25 offset 0 

Raw-Abfragen sind wieder ein Array, aber ich brauche eine Eloquent Sammlung wie zu bekommen:

return $this->model 
->where(...) 
->oldest('seen') 
->latest() 
->paginate($n); 

Ich habe versucht, viele verschiedene Möglichkeiten, aber keine von ihnen funktioniert ...

Gibt es keine Möglichkeit, das mit Unterabfragen oder etwas anderes zu tun?

+0

ich habe Trie d einige Dinge, wie folgt aus: '$ liste_clients = $ this-> Modell -> mit ('Kunden') -> where ('clients.id_marchand', '=', Auth() -> Benutzer() - > id) -> where ('users.id', '=', 'clients.id_client'); $ liste_employes = $ this-> Modell -> mit ('employes') -> where ('employes.id_marchand', '=', Auth() -> Benutzer() -> id) -> wo ('users.id', '=', 'employees.id_employe') -> union ($ liste_clients); return $ liste_employes -> älteste ('gesehen') -> neueste() -> Paginieren ($ n); ' aber mein größtes Problem ist, dass ich aus mehreren Tabellen mit Query Builder zur Auswahl nicht in der Lage bin . –

Antwort

0

Sie können direkt roh Abfrage wie folgt verwendet werden:

return DB::select(DB::raw(" 
    select * from table_name where column_name = :columnName 
"),['columnName'=>$columnName]); 
0

Ich habe dies versucht:

return DB::select(DB::raw('select users.* from clients, users where clients.id_marchand = 8 and users.id = clients.id_client union select users.* from employes, users where employes.id_marchand = 8 and users.id = employes.id_employe order by `seen` asc, `created_at` desc limit 25 offset 0'), [1]); 

Aber in UserController.php, ich habe das:

public function indexSort($role) 
{ 
    $counts = $this->user_gestion->counts(); 
    $users = $this->user_gestion->index(25, $role); 
    $links = $users->render(); 
    $roles = $this->role_gestion->all(); 

    return view('back.users.index', compact('users', 'links', 'counts', 'roles'));  
} 

Und Laravel sagen mir, dass ich 'Render' Methode nicht auf ein Array anwenden kann ...

Also ich denke, ich brauche stattdessen eine Eloquent Sammlung zu bekommen ...

ich dies einige Dinge wie auch versucht habe:

$liste_clients = $this->model 
->with('clients') 
->where('clients.id_marchand', '=', auth()->user()->id) 
->where('users.id', '=', 'clients.id_client'); 

$liste_employes = $this->model 
->with('employes') 
->where('employes.id_marchand', '=', auth()->user()->id) 
->where('users.id', '=', 'employes.id_employe') 
->union($liste_clients); 

return $liste_employes 
->oldest('seen') 
->latest() 
->paginate($n); 

aber mein größtes Problem ist, dass ich nicht in der Lage bin von zu wählen mehrere Tabellen mit Abfragegenerator

Auch bei beitreten:

$liste_clients = $this->model 
->join('clients', function ($join) { 
    $join->on('users.id', '=', 'clients.id_client') 
    ->where('clients.id_marchand', '=', auth()->user()->id); 
}); 

$liste_employes = $this->model 
->join('employes', function ($join) { 
    $join->on('users.id', '=', 'employes.id_employe') 
    ->where('employes.id_marchand', '=', auth()->user()->id); 
}) 
->union($liste_clients); 

return $liste_employes 
->oldest('seen') 
->latest() 
->paginate($n); 

Ich erhalte eine Fehlermeldung:

SQLSTATE [21000]: Cardinality Verletzung: 1222 Die verwendeten SELECT-Anweisungen haben eine unterschiedliche Anzahl von Spalten (SQL: (SELECT COUNT (*) als Aggregat aus users Exklusionsverknüpfung employes auf users. id = employes. id_employe und employes. id_marchand = 8) union (select * from users innere Verbindung clients auf users. id = clients. id_client und clients.id_marchand = 8), um nach seen asc, created_at ab)

Auf einem anderen Forum, ein Mann und sagte mir einfach diese im Repository zu tun:

return $this->model 
->with('role', 'clients', 'employes') 
->oldest('seen') 
->latest() 
->paginate($n); 

und dann mit etwas foreach zu spielen die Aussicht, wie:

@foreach($users->clients as $client) 

Aber ich kein Ergebnis bekommen konnte, und ich weiß nicht, warum ...

Verwandte Themen