Laravelにはそのような方法はないと思います。カスタムクエリを作成する必要があります。このカスタムクエリは、複数のクエリが実行されるため、非常にコストがかかる可能性があります。したがって、これに対する最適な解決策は、私によれば、ユーザーと機会を外部キーに関連付けることです。
ただし、UserとOpportunityを外部キーにリンクしたくない場合は、これを処理するカスタムクエリを作成できます。機会とクライアントモデルの間に「hasManyThrough」関係を追加するだけです。
<?php
class Client extends Eloquent{
public function store(){
return $this->hasMany('Store');
}
public function user(){
return $this->belongsTo('User');
}
public function opportunity(){
return $this->hasManyThrough('Opportunity', 'Store');
}
}
次に、ユーザーモデルで静的関数を作成します。
<?php
class User extends Eloquent implements UserInterface, RemindableInterface {
use UserTrait, RemindableTrait;
public function client(){
return $this->hasMany('Client');
}
public function store(){
return $this->hasManyThrough('Store', 'Client');
}
public static function getOpportunityOfUser($userId)
{
$clients = User::find($userId)->client;
foreach ($clients as $client) {
$opportunities[] = Client::find($client->id)->opportunity;
}
return $opportunities;
}
}
これで、ユーザーが実現したオポチュニティに一度にアクセスできます。
Route::get('/', function()
{
return $usersOpportunities = User::getOpportunityOfUser(1);
});
これにより、IDが「1」のユーザーに関連するすべてのクライアントのすべての機会が返されます。