2017-05-20 12 views
0

私はLaravel 5.4を使用して、人が作成した、または管理しているタスクを返します。Eloquent複数のリレーションをマージする方法は?

コードは以下の通りである:

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

この関数は、型Illuminate\Database\Eloquent\Relations\Relationのオブジェクトを返すことが期待されます。

私は、これら2つの試みを試みたが、それらのどれもが必要な型を返しません:クエリビルダを使用して

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

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

第二の試み:

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 

が、それはこれらの2つの関係をマージして戻すことができるの結果はIlluminate\Database\Eloquent\Relations\Relationタイプですか?

+0

タイプリレーションが返される必要がある理由は何ですか? –

+0

あまりにも多くの理由があります。 – Warrio

答えて

0

私はそれはできません(今のところ)。

1

何らかの種類のハッキングやパッ​​ケージを使用することは可能かもしれませんが、私はあなたのテーブル構造をちょっと考え直すことをお勧めします。

Persons 
    id 
    other_data 

Task 
    managed_by_type 
    managed_by_id 
    created_by_type 
    created_by_id 
    other_data 

あなたがにスワップ場合:

Person 
    id 
    other_data 

Task 
    id 
    other_data 

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

あなたは今後、より柔軟なソリューションを持っているでしょう、私はあなたが持っているあなたの記事から集めたものから。

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

クールな代替。ありがとうございました。私はそれを考慮する。 しかし、私はこの質問に答えが出るまで代替案を考えるのを待つでしょう:複数の優柔不断な関係をマージすることが可能ならば?雄弁な関係タイプとして結果を得る。 ? – Warrio

関連する問題