2017-07-07 37 views
4

我知道我可以使用count()來查詢在Laravel雄辯的關係,就像這樣:Laravel查詢關係上的一個模型實例

if(count($question->answers())) 

answers()hasMany關係:

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

我的問題是,$question不是一個完整的集合,而是一個Model實例時,我該怎麼做?

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

如何查詢上面的問題,只有這個問題,對於使用count()潛在的關係?

我總是得到大於零的count(),即使選擇的問題有沒有相關的答案,這意味着我如果塊始終運行和返回無端null值:

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

使用'計數($問題 - >答案)'或'count($ question-> answers() - > get());';我不認爲'count()'在'QueryBuilder'實例上是有效的,這就是'$ question-> answers()'的意思。 –

+0

@TimLewis謝謝! –

+0

@TimLewis如果你想創建一個答案,我可以接受它! –

回答

2

由於調用$question->answers()正在恢復一個QueryBuilder實例,在那個時候調用count()很可能總是返回1。如果您訪問$question->answers(爲property,而不是一個method),或使用完整的邏輯$question->answers()->get();應適當返回Collection,這count()將正常運行上:

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

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

// OR 

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

正如@maraboc建議,你也可以渴望您的負載與$question使用answers一個->with()條款:

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

但即使在這種情況下,$question->answers()仍然會返回一個QueryBuilder例如,因此請將其作爲property以便count()正常運行。

0

正如已經指出的count($question->answers())已經沒有意義了,因爲$question->answers()是關係實例,就可以調用動態查詢方法上,但如果你要計算的元素,你需要一個集合,即$question->answers

所以,你有兩個選擇:

  1. 數集合:count($question->answers)
  2. 查詢數據庫做計數:$question->answers()->count()

括號事項