如何获得修改的关系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);}])
在已评论的应答中再次查询数据库。这是一个非常成功的表演。这就是我想要避免的。在他的问题中,他指定了“我们希望获得问题及其答案,并分别接受答案”。这意味着他希望“所有答案”和“所选答案”都满足要求。那么,当我们在获取的数据中获得所选答案时,为什么还要再次查询数据库呢。?