2017-05-20 2 views
0

Ich benutze Laravel 5.4, um Aufgaben zurückzugeben, die eine Person erstellt hat oder verwaltet.Wie mehrere eloquente Beziehungen zusammenführen?

Der Code ist wie folgt:

public function tasks() 
{ 
    $creator = $this->morphMany('App\Task', 'created_by'); 
    $manager = $this->morphMany('App\Task', 'managed_by'); 
} 

Diese Funktion erwartet wird Illuminate\Database\Eloquent\Relations\Relation ein Objekt vom Typ zurückzukehren.

Ich habe versucht, diese beiden Versuche, aber keiner von ihnen gibt den gewünschten Typ:

// using merge: 
$task1 = collect([$creator]); 
$task2 = collect([$manager]); 

return $task1->merge($task2); // it returns an empty collection. 

2. Versuch mit Query Builder:

return Task:: 
    where([ 
     ['created_by_type', '=', 'App\Person'], 
     ['created_by_id', '=', $this->id] 
    ]) 
    ->orwhere([ 
     ['managed_by_type', '=', 'App\Person'], 
     ['managed_by_id', '=', $this->id] 
    ])->get(); 
// returns the correct data but not as an object of Illuminate\Database\Eloquent\Relations\Relation 

Ist es möglich, diese beiden Beziehungen zu verschmelzen und das Rück die Ergebnis als Illuminate\Database\Eloquent\Relations\Relation Typ?

+0

Aus welchem ​​Grund benötigen Sie die zurückgegebene Typrelation? –

+0

zu viele Gründe, sie alle hier aufzulisten. – Warrio

Antwort

0

Ich denke, es ist nicht möglich (für jetzt).

1

Während es möglich ist, eine Art von Hack zu machen oder ein Paket zu verwenden, denke ich, dass Sie am besten wären, Ihre Tischstruktur ein wenig zu überdenken. Von dem, was ich von Ihren Beiträgen sammeln müssen Sie:

Persons 
    id 
    other_data 

und

Task 
    managed_by_type 
    managed_by_id 
    created_by_type 
    created_by_id 
    other_data 

wenn Sie vertauscht:

Person 
    id 
    other_data 

Task 
    id 
    other_data 

Person_Task 
    owner_id 
    owner_type 
    task_id 
    type // managed or created (int) 

Sie eine flexiblere Lösung für die Zukunft haben würden.

public function tasks() 
{ 
    return $this->morphMany('App\Task', 'owner', 'persons_tasks'); 
} 

public function createdTasks() 
{ 
    return $this->morphMany('App\Task', 'owner', 'persons_tasks')->withPivot('type')->where('type', 0); 
} 

public function managedTasks() 
{ 
    return $this->morphMany('App\Task', 'owner', 'persons_tasks')->withPivot('type')->where('type', 1); 
} 
+0

coole Alternative. Danke. Ich werde darüber nachdenken. aber ich werde warten, um an eine Alternative zu denken, bis ich eine Antwort auf diese Frage bekomme: Wenn es möglich ist, mehrere eloquente Beziehungen zusammenzuführen? und erhalte das Ergebnis als eloquenten Relationstyp. ? – Warrio

Verwandte Themen