2017-02-05 38 views
0

を動作させることはできません。は、私は3つのテーブルを持っているhasManyThroughが

今、私は会社の取引を通じて各会社のブローカーのリストを取得したいと考えています。これを行うために、私はhasManyThrough()がその仕事をすると思った。しかし、私はそれを働かせることはできません。会社 - >ブローカー、

class Company extends Model 
{ 
    protected $table = 'nCompanies'; 
    protected $primaryKey = 'nCompanyId'; 

    public function transactions() 
    { 
     return $this->hasMany('App\Transaction', 'nCompanyId'); 
    } 

    public function brokers() 
    { 
     //This does not work 
     return $this->hasManyThrough('App\Broker', 'App\Transaction', 'nCompanyId', 'nBrokerId'); 
    } 

} 

以下の作品が、私はそれぞれの会社のためにブローカーのコレクションを取得するために、モデルにしてこれを行うことを好むだろう:私の会社のモデルの中で

私はこれを持っています平らなリストの代わりに。

$companies = DB::table('nCompanies') 
      ->join('nTransactions', 'nCompanies.nCompanyId', '=', 'nTransactions.nCompanyId') 
      ->join('nBrokers', 'nTransactions.nBrokerId', '=', 'nBrokers.nBrokerId') 
      ->selectRaw('nBrokers.*, nCompanies.*) 
      ->groupBy('nCompanies.nCompanyId', 'nBrokers.nBrokerId') 
      ->get(); 

どうすればこの問題を解決できますか? hasManyThroughの代わりに別のものを使うべきですか?

答えて

0

HasManyThroughは、TransactionとBrokerの関係が間違っているため、ここでは機能しません.HasMany関係のCompany-> Transactionが存在しますが、HasOne関係のTransaction-> Brokerのみが存在します。 HasManyThroughが動作するためには、どちらもHasManyでなければなりません。

提案された解決策は、このように、モデル内のサブクエリと一緒にアクセサを使用することです:

public function getBrokersAttribute() 
{ 
    $transactionIds = $this->transactions->groupBy('nBrokerId')->lists('nBrokerId'); 
    return Broker::find($transactionIds); 
} 

はLaravelは$transactionIdsの結果をキャッシュしていても、この2つの別々のクエリを引き起こすことに注意してください最初の負荷の後に。また、このソリューションは熱心な負荷をサポートしておらず、多くの企業と協力して作業する場合は推奨されません。

また、あなたは積極的なロードの能力を維持するために、いくつかのループを使用することができます。

public function getBrokersAttribute() 
{ 
    $brokers = new Collection(); 
    foreach ($this->transactions as $transaction) { 
     if (!$brokers->contains($transaction->broker->nBrokerId)) { 
      $brokers->add($transaction->broker); 
     } 
    } 
    return $brokers; 
} 

をこの例では、あなたが->with('transactions.broker')を熱心負荷使用することができます。

+0

ありがとう!できます – Josef

0

私はあなたの質問を再度読んで、あなたはトランザクションを通してブローカーと企業を手に入れたいと気づきました。私はすでに取引テーブルにnCompanyIdnBrokerIdの両方を持っていると思います。その後、私はあなたが持つことができるので、ブローカーが、その後Transactionモデルにアクセスする必要がありますね。

class Transaction extends Model 
{ 
    public function brokers() 
    { 
     return $this->hasMany('App\Broker', 'nBrokerId'); 
    } 
} 

だから、あなたがそれを呼び出すことができます。

$brokers = Company::find(1)->transactions->where('id', '1')->brokers(); 

これはこれについて私の考えのほんの一例ですしかし、

あなたがしようとしていることを得るのに役立つかどうかわかりません。 :)

+0

ありがとうございますが、私は各社のブローカーのリストが必要です。だからX社にとって、私はその会社に取引をしたすべての異なるブローカーを見せたいと思う。 – Josef