如何获得修改的关系laravel
我们有模型:问答 在答案表中,我们有一个名为如何获得修改的关系laravel,laravel,laravel-5,laravel-5.6,Laravel,Laravel 5,Laravel 5.6,我们有模型:问答 在答案表中,我们有一个名为accepted的布尔列,我们只有一个接受的答案。我们想得到问题的答案,并分别接受答案 我使用两种方法,但我不知道哪种更好: 1) 。检查是否加载了关系如果加载了筛选器关系,并获得如下接受答案: if(!$this->relationLoaded('answers')){ $this->load('answers'); } return $this->answers->fi
accepted
的布尔列,我们只有一个接受的答案。我们想得到问题的答案,并分别接受答案
我使用两种方法,但我不知道哪种更好:
1) 。检查是否加载了关系如果加载了筛选器关系,并获得如下接受答案:
if(!$this->relationLoaded('answers')){
$this->load('answers');
}
return $this->answers->firstWhere('accepted',true);
2) 。我们也可以使用这种方法:
function accepted_answer(){
return $this->answer()->where('accepted',true);
}
第二种方法的问题是我们得到一个数组,但我们期望一个响应或null。
有没有更好的方法,或者我们不能使用1或2?您应该使用第二种方法,因为如果某些情况发生变化,您将有一个单一的来源进行更改(而不是挖掘大量控制器) 要获得结果,请使用
->get()代码>在生成器查询的末尾
备注:通常总比在控制器内部手动编写查询要好在问题
模型上创建访问器
class Question extends Model
{
public function getSelectedAnswerAttribute()
{
return $this->answers->where('accepted', true)->first();
}
}
public function scopeAccepted($query){
return $query->where("accepted",true)->first();
}
现在在每个Answer
实例中都有一个名为selected\u Answer
的属性
你可以像这样访问它
$answer->selected_answer;
注意
此“选定答案”不是从数据库中提取的,它从已提取的答案列表中筛选。因此,它比第二种方法更有效
而且,如果希望此属性始终自动绑定到问题
模型。将此存取器
添加到附录
数组中
型号
protected $appends = ['selected_answer'];
在您的答案
模型上创建已接受的
范围
class Question extends Model
{
public function getSelectedAnswerAttribute()
{
return $this->answers->where('accepted', true)->first();
}
}
public function scopeAccepted($query){
return $query->where("accepted",true)->first();
}
然后你可以很容易地检索第一个被接受的答案
$question->answer()->accepted();
欲了解更多详情,请查看 您在这里所做的是查询所有答案,然后使用where
对它们进行过滤,如果有很多答案/问题,这可能会影响性能。但我会向上投票,因为一般的方法是使用附录
,但只有在调用“selected_answer”时才会这样做。当他调用它时,他已经使用with()
eager load获取了所有答案。这是我的观点,这是真的,但如果他在执行selected\u answer
之前不调用load('answers')
?您只需编辑帖子,而不是使用(['answers'=>function($query){return$query->where('accepted',true);}])
在已评论的应答中再次查询数据库。这是一个非常成功的表演。这就是我想要避免的。在他的问题中,他指定了“我们希望获得问题及其答案,并分别接受答案”。这意味着他希望“所有答案”和“所选答案”都满足要求。那么,当我们在获取的数据中获得所选答案时,为什么还要再次查询数据库呢。?