2017-07-07 18 views
4

私はそうのように、Laravelで雄弁な関係を照会するためにcount()を使用できることを認識しています:Laravelクエリ関係

answers()hasMany関係です
if(count($question->answers())) 

public function answers() 
    { 
     return $this->hasMany('App\Models\Answer', 'question_id'); 
    } 

私の質問は、$questionがコレクション全体ではなく、1つのModelインスタンスであるとき、どうすればいいのですか?私はcount()を使用して潜在的な関係のために、上記の質問を照会し、唯一のその質問にはどうすればよい

$question = Question::where('id',$key)->first(); 

?戻っている$question->answers()を呼び出すので

if(count($question->answers())) 
    { 
    //returns nulls 
    } 
+1

を大切に - >答え) 'または' count($ question-> answers() - > get()); ';私は 'query()'が 'QueryBuilder'インスタンスで有効であるとは思っていません。' $ question-> answers() 'となります。 –

+0

@TimLewisありがとう! –

+0

@TimLewis回答を作成したい場合、私はそれを受け入れることができます! –

答えて

2

私は常に選択した質問は、ブロックが常に実行されている場合、私を意味し、何の関連する答えを持っていないし、不当なnull値を返す場合でも、ゼロより大きいのcount()を取得していますQueryBuilderインスタンスでは、count()を呼び出すと、ほとんどの場合、常に1が返されます。あなたも可能性、@marabocによって示唆されるように

$question = Question::where('id',$key)->first(); 

if(count($question->answers) > 0){ 
    // Do something 
} 

// OR 

if(count($question->answers()->get()) > 0){ 
    ... 
} 

:あなたは(propertyなくmethodなど)$question->answersにアクセスし、または完全なロジック$question->answers()->get();を使用する場合には、適切に正しく機能しますcount()Collection、返す必要があります熱心な負荷answersであなたの$question->with()句使用:

$question = Question::with(["answers"])->where('id',$key)->first(); 

をしかし、この場合であっても、$question->answers()はまだQueryBuilderインスタンスを返すことになります、したがって、count()propertyとして正しく機能するようにアクセスしてください。

0

すでにcount($question->answers())は、$question->answers()がリレーションインスタンスであるため意味がありません。動的クエリメソッドを呼び出すことはできますが、要素を数えたい場合は、$question->answersのようにコレクションを必要とします。

だから、2つの選択肢があります:

  1. コレクションを数える:count($question->answers)
  2. は、カウントを行うためのデータベースを頼む:$question->answers()->count()

括弧は `数($の質問を使用し