2017-12-14 5 views
0

Es wird folgende Modelle und TabelleWie polymorphe Tabelle in Laravel/Eloquent

CallRequest (parent) 
    'id', 
    'parent_id', 
    'phone_number', 
    'extension_id', 
    'extension_type', 

public $morphTo = [ 
    'extension' => [], 
]; 


AsapLead (children) 
    'id' 

public $morphOne = [ 
    'call_request' => [ 
     CallRequest::class, 
     'name' => 'extension', 
    ], 
]; 

mit polymorpher Beziehung darin Aliasname. Um eine Pivot-Tabelle zu vermeiden, werden alle Daten in einer Tabelle gespeichert, so dass die übergeordneten Aufrufe parent_id, extension_id und extension_type nicht gefüllt sind. Nur Kinder werden diese haben. So schnell wie möglich führen Sie nur id, Rest der benötigten Informationen ist in seiner Eltern.

Flow: Erstens ist es erstellt parent Anruf mit parent_id = null. Wenn der Anruf fehlschlägt, wird ein unter dem parent_id verbundener untergeordneter Anruf erstellt. Zusätzlich wurde extension_type hinzugefügt, da es sich um mehr als eine Erweiterung handelt, aber nicht um viel zu komplizieren, wir arbeiten in dieser Situation nur an einer. Dann muss ich das Eltern abrufen abrufen, die maximal 3 Kinder haben und nicht vor 7 Tagen zurück erstellt werden. Abfrage aussehen wie folgt:

$callRequestTable = CallRequest::table(); 
$leadTable = CallRequest::table() . " as lead"; 

DB::table($leadTable) 
    ->rightjoin($callRequestTable, 'lead.id', '=', $callRequestTable . '.parent_id') 
    ->where($callRequestTable . '.extension_type', '=', AsapLead::class) 
    ->where($callRequestTable . '.created_at', '>', Carbon::now()->subDays(7)) 
    ->groupBy('lead.id') 
    ->having(DB::raw('count(*)'), '<', 3) 
    ->select('lead.*') 
    ->get(); 

Aber leider funktioniert es nicht. Es wäre sogar besser, auf CallRequest::... zu operieren, um am Ende diese Modelle anstelle von einfachen Arrays zu bekommen, aber ich war auch nicht in der Lage, es herauszufinden.

Antwort

0

Das schließlich für mich gearbeitet:

$callRequestTable = CallRequest::table(); 
$leadTable = CallRequest::table() . " as lead"; 

return CallRequest::from(DB::raw($leadTable)) 
    ->leftJoin($callRequestTable, 'lead.id', '=', $callRequestTable . '.parent_id') 
    ->where('lead.extension_type', '=', AsapLead::class) 
    ->where('lead.created_at', '>', Carbon::now()->subDays(7)) 
    ->groupBy('lead.id') 
    ->having(DB::raw('count(*)'), '<', 3) 
    ->select('lead.*'); 
1

Sie haben Raw Expressions in Ihrer Abfrage verwenden Tabellennamen SQL-Ausdruck zu verwandeln, ist hier ein Beispiel:

DB::table(DB::raw('callRequests AS leads'))->...