2017-07-07 36 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()

括号事项