2016-10-29 18 views
0

私は単一のモデルを持っており、異なるリレーションを持つ複数のwithCountsにチェーンしようとしています。次に例を示します。

return MyModel::query() 
     ->withCount(array('users'=>function($query){ 
      $query->where('enabled', '=', 1); 
     })) 
     ->withCount(array('users'=>function($query){ 
      $query->where('phone', '=', "123-4567"); 
     })) 
     ->get(); 

Laravelは自動的に「USERS_COUNT」と呼ばれる私の結果にsnake_caseフィールド名を返し、基本的にこれは、クエリの有効部分は、携帯電話のセクションで上書きされることを意味ので、これは動作しません。

私はBuilder.phpクラスをちょっと調べて、$ asColumnが返される名前であることに気付きました:https://github.com/laravel/framework/commit/67b821dde62e64f94aa7d99f1806ecf03ea323e5これは、リレーションの$ name + '_count'のちょうどsnake_caseです。

生のクエリを使用せずにカスタム$ asColumnを作成して、両方の結果を得る方法はありますか?私は基本的に私の結果がenabled_users_countとphone_users_count、またはそれに類するものであることを望んでいます。私はまた、2つの異なるクエリを行う必要はありません。

答えて

2

この機能は、2016-09-08にリリースされたLaravel 5.3.7以降で利用できます。

5.3.7以降の場合、withCountメソッドの関係文字列にas new_nameを追加するだけで、カウントフィールドの名前はnew_name_countとなります。このコードはenabled_users_countフィールドとphone_users_countフィールドを生成します

return MyModel::query() 
    ->withCount(array('users as enabled_users'=>function($query){ 
     $query->where('enabled', '=', 1); 
    })) 
    ->withCount(array('users as phone_users'=>function($query){ 
     $query->where('phone', '=', "123-4567"); 
    })) 
    ->get(); 

:だから、あなたのコードは次のようになります。

このバージョンではなく、アップグレードできない場合は、@ RossWilsonで述べたように、新しい関係を定義するルートに進む必要があります。

+0

この回答と@Ross Wilsonはどちらも正しいと思いますが、この回答はライブラリに組み込まれているのでもう少しきれいです。私にとって不幸なことに、私はLaravelの古いバージョンを使用しているので、私は彼を使用する必要があります。 – stealthysnacks

2

私が知っている唯一の方法は、それらの条件に対して異なる関係を定義してから、whereCountにそれらを使用することです。

public function enableUsers() 
{ 
    return $this->hasMany(User::class) //Or whatever the relationship is 
     ->where('enabled', '=', 1); 
} 

はその後:

MyModel::withCount('enabledUsers', 'phoneUsers')->get(); 

は、この情報がお役に立てば幸い!

+0

- > where()のような節をリレーションに直接追加することはできませんでした。いい答えだ! – stealthysnacks

関連する問題